`[< -`函数如何在R中起作用?

时间:2016-02-01 20:15:36

标签: r slice assignment-operator

我发现有几个人使用[<-作为波兰表示法的函数,例如

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而感到好奇。

2 个答案:

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