创建具有连续名称的R对象的最短方法是什么?

时间:2013-02-25 00:12:08

标签: r performance

这就是我现在所拥有的:

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:我们需要的约束(以及因此权重)的数量。想象一下,这是一个常见的编程问题,所以确定有一个解决方案。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

我只是试图去实现这一目标,但没有快乐,也许别人比我更好(最有可能!!)。但是我无法帮助,但感觉将所有数组放在一个对象,一个列表中可能更容易;这样一条lapply线就可以了,而不是引用weights1 weights2 weights3 weights4,而是weights[[1]] weights[[2]] {{1 }} weights[[3]]。这些数组的未来操作也将通过apply系列函数实现。对不起,我无法完全按照你的描述得到它。

答案 2 :(得分: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