2016-12-12 2 views
1

Я хотел бы расширить этот код от {x.a, x.b, x.c} до {x.a, ..., x.n}, где n определяется как длина (имена).Динамический вектор имен: увеличение от 3 до n

names = c("a", "b" , "c") 
set.seed(123) 
x.nsim = 5000 
x.a = runif(x.nsim, min=-1.5, max=1.5) 
x.b = runif(x.nsim, min=-1.5, max=1.5) 
x.c = 1 - x.a - x.b 

for (i in 1:x.nsim) { 
    z.vec = c(x.a[i], x.b[i], x.c[i]) 
    points(z.vec^3, z.vec, cex=0.1) 
} 

Я попытался сделать это расширение. Любые намеки?

a<-NULL 
for (name in names){ 
    #x<-paste("x.",name,"[i]", sep="", collapse="") 
    a<-cbind(a, paste("x.",name,"[i]", sep="", collapse="")) 
    a 
} 
a 
z.vec <- NULL 
for (i in 1:x.nsim){ 
    for (j in 1:length(names)){ 
    z.vec <- cbind(z.vec, a[j]) 
    points(z.vec^3, z.vec, cex=0.1) 
    } 
} 
+1

Вы должны использовать структуры данных вместо последовательных имен. Используйте векторы, матрицы или списки в зависимости от размерности объектов, которые вы пытаетесь назвать последовательно. – Gregor

+1

Возможно, должно быть '1: x.nsim' вместо' 1: length (x.nsim) ', потому что это просто' 1: 1'. –

ответ

0

Как отметил Грегор, вы должны использовать структуры данных здесь. Поскольку у нас много векторов одинаковой длины и типа (и происхождения), естественно использовать матрицы здесь. Давайте установим начальные параметры:

nsim <- 5000 
n <- 10 

Как я понимаю из того, что вы написали, мы должны попробовать (n-1) векторов длины nsim из равномерного распределения на [-1.5, 1.5]. Вместо того, чтобы имитировать один вектор за другим, мы можем сделать это гораздо быстрее, имитируя (n-1)*nsim значения, а затем положить их в матрицу с (n-1) столбцами:

m <- matrix(runif((n - 1)*nsim, -1.5, 1.5), ncol = n - 1) 

Номер столбца n является 1 - [sum of first (n-1) columns] (опять же, как я понимаю).

m <- cbind(m, 1 - rowSums(m)) 

Теперь вы можете получить свой z.vec номер i как m[i,].

+0

@ Ярослав Домин благодарит, что это круто. есть ли другие способы его решения (педагогически)? – rrg

+0

Конечно, есть. Но из того, что я могу придумать здесь, все выглядит более уродливым и менее оптимизированным. –