`[<-` 函数在 R 中如何工作?
How does the `[<-` function work in R?
我见过一些人使用 [<-
作为波兰语表示法的函数,例如
x <- matrix(1:4, nrow = 2)
`[<-`(x, 1, 2, 7)
其中 returns
[,1] [,2]
[1,] 1 7
[2,] 2 4
我试过玩弄一下 [<-
,看起来像这样使用它会打印类似 x[1,2] <- 7
的结果,而无需实际执行赋值。但是我无法确定这个函数到底做了什么,因为 ?"["
的文档只是顺便提到了它,我无法在 google 或 SO 中搜索“[<-” .
是的,我知道实际上 使用 这可能是一个可怕的想法,我只是想更好地理解 R。
您需要执行以下操作才能完成作业:
`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7)
x
[,1] [,2]
[1,] 1 7
[2,] 2 4
本质上发生的事情是 [
正在创建指向 x
的行列位置的指针,然后是 <-
(这实际上是 assign
的同义词也可以用在中缀表示法中)正在执行实际的 "permanent" 赋值。不要误以为这是一个引用调用赋值。我有理由相信仍然会创建 x
的临时值。
您的版本确实进行了子分配(从它返回的内容可以看出)但该分配仅在调用 [<-
的本地环境中,不包含全局环境。
由于 `[`(x, y)
对对象进行切片,而 `<-`(x, z)
执行赋值,因此 `[<-`(x,y,z)
似乎会执行赋值 x[y] <- y
。 @42- 的回答很好地解释了 [<-
的实际作用,而对 `levels<-`( What sorcery is this? 的最佳回答提供了一些关于为什么 R 以这种方式工作的见解。
要了解 [<-
在幕后实际做了什么,您必须转到 C 源代码,对于 [<-
可以在 http://svn.r-project.org/R/trunk/src/main/subassign.c 找到(相关部分开始在 1470 行左右)。您可以看到 x
,对象 "assigned to" 受到保护,因此只有本地版本发生变异。相反,我们使用 VectorAssign、MatrixAssign、ArrayAssign 等在本地执行赋值,然后返回结果。
我见过一些人使用 [<-
作为波兰语表示法的函数,例如
x <- matrix(1:4, nrow = 2)
`[<-`(x, 1, 2, 7)
其中 returns
[,1] [,2]
[1,] 1 7
[2,] 2 4
我试过玩弄一下 [<-
,看起来像这样使用它会打印类似 x[1,2] <- 7
的结果,而无需实际执行赋值。但是我无法确定这个函数到底做了什么,因为 ?"["
的文档只是顺便提到了它,我无法在 google 或 SO 中搜索“[<-” .
是的,我知道实际上 使用 这可能是一个可怕的想法,我只是想更好地理解 R。
您需要执行以下操作才能完成作业:
`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7)
x
[,1] [,2]
[1,] 1 7
[2,] 2 4
本质上发生的事情是 [
正在创建指向 x
的行列位置的指针,然后是 <-
(这实际上是 assign
的同义词也可以用在中缀表示法中)正在执行实际的 "permanent" 赋值。不要误以为这是一个引用调用赋值。我有理由相信仍然会创建 x
的临时值。
您的版本确实进行了子分配(从它返回的内容可以看出)但该分配仅在调用 [<-
的本地环境中,不包含全局环境。
由于 `[`(x, y)
对对象进行切片,而 `<-`(x, z)
执行赋值,因此 `[<-`(x,y,z)
似乎会执行赋值 x[y] <- y
。 @42- 的回答很好地解释了 [<-
的实际作用,而对 `levels<-`( What sorcery is this? 的最佳回答提供了一些关于为什么 R 以这种方式工作的见解。
要了解 [<-
在幕后实际做了什么,您必须转到 C 源代码,对于 [<-
可以在 http://svn.r-project.org/R/trunk/src/main/subassign.c 找到(相关部分开始在 1470 行左右)。您可以看到 x
,对象 "assigned to" 受到保护,因此只有本地版本发生变异。相反,我们使用 VectorAssign、MatrixAssign、ArrayAssign 等在本地执行赋值,然后返回结果。