3

这就是我目前所拥有的:

weights0 <- array(dim=c(nrow(ind),nrow(all.msim))) 
weights1 <- array(dim=c(nrow(ind),nrow(all.msim)))
weights2 <- array(dim=c(nrow(ind),nrow(all.msim)))
weights3 <- array(dim=c(nrow(ind),nrow(all.msim)))
weights4 <- array(dim=c(nrow(ind),nrow(all.msim)))
weights5 <- array(dim=c(nrow(ind),nrow(all.msim)))
weights0 <- 1 # sets initial weights to 1

很好很清晰,但不是很好很短!有经验的 R 程序员会以不同的方式编写它吗?

编辑:

此外,是否有一种既定的方法可以创建多个权重,这些权重取决于预先存在的变量以使其具有普遍性?例如,参数 num.cons 等于 5:我们需要的约束(以及权重)的数量。想象一下这是一个常见的编程问题,所以肯定有解决方案。

4

3 回答 3

9

选项1

如果您想在您的环境中创建不同的元素,您可以使用for循环和分配来完成。其他选项是sapplyenvir论点assign

for (i in 0:5)
    assign(paste0("weights", i), array(dim=c(nrow(ind),nrow(all.msim))))

选项 2

但是,正如@Axolotl9250 指出的那样,根据您的应用程序,通常将这些都放在一个列表中是有意义的

weights <-  lapply(rep(NA, 6), array, dim=c(nrow(ind),nrow(all.msim)))

然后分配给weights0你上面,你会使用

weights[[1]][ ] <- 1  

[ ] 注意分配给所有元素的空weights[[1]]


选项 3

根据@flodel 的建议,如果您的所有数组都具有相同的暗度,您可以创建一个大数组,其长度的额外暗度等于您拥有的对象数量。(即,6)

weights <- array(dim=c(nrow(ind),nrow(all.msim), 6))

请注意,对于任何选项:

如果要分配给数组的所有元素,则必须使用空括号。例如,在选项 3 中,要分配给第一个数组,您可以使用:

weights[,,1][] <- 1
于 2013-02-25T00:36:22.337 回答
6

我刚刚尝试实现这一目标,但没有喜悦,也许其他人比我更好(很可能!!)。但是我不禁觉得将所有数组放在一个对象(一个列表)中可能更容易;这样一来,一条 lapply 线就可以了,而不是引用weights1 weights2 weights3 weights4weights[[1]] weights[[2]] weights[[3]] weights[[4]]。然后,对这些数组的未来操作也将通过 apply 系列函数来实现。对不起,我不能完全按照你的描述。

于 2013-02-25T00:24:49.657 回答
2

鉴于您正在做的事情,只需使用for循环即可快速直观

# create a character vector containing all the variable names you want..
variable.names <- paste0( 'weights' , 0:5 )

# look at it.
variable.names

# create the value to provide _each_ of those variable names
variable.value <- array( dim=c( nrow(ind) , nrow(all.msim) ) )

# assign them all
for ( i in variable.names ) assign( i , variable.value )

# look at what's now in memory
ls()

# look at any of them
weights4
于 2013-02-25T00:34:32.487 回答