`[<-` 函数在 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 等在本地执行赋值,然后返回结果。