【问题标题】:What's the shortest way of creating a load of R objects with consecutive names?创建具有连续名称的大量 R 对象的最短方法是什么?
【发布时间】:2013-02-10 02:00:56
【问题描述】:

这是我目前得到的:

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

【问题讨论】:

  • 明白你的意思,但我认为我的问题更笼统。也许我首先通过创建多个对象从错误的角度接近它。可以将所有权重合并到一个对象中...您建议尝试一下吗?
  • 在您将值 1 重新设置为权重 0 时,它不再是一个数组,只是一个长度为 1 的原子向量。
  • 如果所有 (2D) 数组都具有相同的尺寸,您可以只创建一个 3D 数组。
  • @mnel 的评论是正确的。你会想要使用weights0[] &lt;- 1

标签: r performance


【解决方案1】:

选项 1

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

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

【讨论】:

  • 是的,这看起来像是创建连续命名权重的最佳方式 - v. 有用。我在想我现在应该把所有这些对象都打包成 1 个。不过,正如 flodel 所建议的那样,很简单
  • 您的编辑很有用。将其作为列表而不是数组的任何理由。我正在使用 weights
  • @RobinLovelace,将其作为列表允许使用不同大小和类的数组。如果它们都相同,那么使用 florel 的建议是最佳的。
  • 没错,我发现的列表对于您可以在每个元素中添加的内容更加宽容。我广泛使用不同大小的矩阵,现在我已经到了这一点,我总是不得不停下来思考有没有比列表更好的方法,因为它已成为我选择的自动存储选项。
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2021-01-25
      • 2018-05-12
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多