【问题标题】:R - using the assign() function for subsetting an arrayR - 使用 assign() 函数对数组进行子集化
【发布时间】:2015-12-28 18:13:03
【问题描述】:

我试图在以下可重现的示例中了解我的问题的要点:

mat <- matrix(3:6,nr=2,nc=2)
j=1
> eval(parse(text=paste0("m",c("a","b")[j],"t","[1,1]")))
[1] 3
> assign(paste0("m",c("a","b")[j],"t","[1,1]"),45)
> mat
      [,1] [,2]
[1,]    3    5
[2,]    4    6

我的问题是mat[1,1] 仍然等于3 而不是45,正如我所期望的那样。

【问题讨论】:

  • 我认为这对我们了解您为什么要以这种方式使用assign() 很有帮助。
  • 我正在尝试增加一个名称变化的数组。
  • 我几乎可以肯定你不能以这种方式使用assign(),因为assign() 对名称进行操作。矩阵的名称只是 mat 或其他名称。其余的东西,即[,实际上是 R 中的一个函数。
  • 这就解释了。谢谢。

标签: r assign


【解决方案1】:

R 入门:"Every operation is a function call." 这意味着,从实际意义上讲,对于您的问题,您不能仅使用名称来使用 assign()。 mat[1,1] 不是名称 - 它是名称 mat 和函数调用 [。所以,在assign 中使用表达式mat[1,1] 将不起作用,因为它试图找到一个名为mat[1,1] 的R 对象(我认为这是灾难性的几个原因......)

这似乎是一个非常奇怪的用例。您可能需要考虑改为在一个函数中工作,该函数有自己的环境,您无需在全局环境中工作即可对其进行操作。

或者,您可以这样做:

eval(parse(text=paste0("m",c("a","b")[j],"t","[1,1] <- 45")))
eval(parse(text=paste0("m",c("a","b")[j],"t","[1,1]")))

我正在努力想一个你想要的原因 - 但理论上这是可能的。基本上,您只需将分配添加到您正在解析的文本中,然后将其传递给eval()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多