我发现有几个人使用[<-
作为波兰表示法的函数,例如
x <- matrix(1:4, nrow = 2)
`[<-`(x, 1, 2, 7)
返回
[,1] [,2]
[1,] 1 7
[2,] 2 4
我尝试过使用[<-
一点点,看起来像这样使用它打印x[1,2] <- 7
之类的结果而不实际执行任务。但是我无法确定这个功能实际上是做什么的,因为?"["
给出的文档只是顺便提到它,而我无法搜索谷歌或SO以获得#34; [ &LT; - &#34;
是的,我知道实际上使用这可能是一个可怕的想法,我只是为了更好地理解R而感到好奇。
答案 0 :(得分:4)
这是你需要做的才能让任务坚持下去:
`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7)
x
[,1] [,2]
[1,] 1 7
[2,] 2 4
基本上发生的事情是[
正在创建指向x
的行 - col位置的指针,然后<-
(这实际上是assign
的同义词也可用于中缀符号)正在做实际的&#34;永久性&#34;分配。不要误以为这是一个按引用调用的分配。我确信仍然会创建x
的临时值。
您的版本确实进行了分配(从返回的内容可以看出),但该分配仅在调用[<-
的本地环境中,并未包含全局环境。
答案 1 :(得分:2)
由于`[`(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
,对象被&#34;分配给&#34;受保护,只有本地版本发生变异。相反,我们使用VectorAssign,MatrixAssign,ArrayAssign等在本地执行赋值,然后返回结果。