R - 使用 assign() 函数对数组进行子集化
R - using the assign() function for subsetting an array
我试图在以下可重现的示例中了解我的问题的要点:
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
。
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()
.
我试图在以下可重现的示例中了解我的问题的要点:
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
。
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()
.