嗨跑了以下几行,有点惊讶。混乱内联:
好的,我创建一个列表:
> x<-list()
将1指定为由&#34; a&#34;
索引的元素> x$a<-1
我想看看x中的内容
> x
$a
[1] 1
是的,到目前为止很好
接下来我宣布一个函数,该函数将获取传递给它的列表,并且像分配索引&#34; a&#34;我只是分配到索引&#34; b&#34;价值2
> foo<-function(xx) {
+ xx["b"]<-2
+ print(xx)
+ }
我用x调用函数 - 我喜欢我所看到的 现在我的想法是列表对象已经通过(当你做&amp; x时通过引用,如C中的那样)并且它被破坏性地修改了
> foo(x)
$a
[1] 1
$b
[1] 2
现在在函数体外我打印x - 但很惊讶没有看到b
> x
$a
[1] 1
>
我读过scooping和参数传递文档,但无法解决这个问题。在调用函数体之前,列表是深度还是浅度复制?
答案 0 :(得分:1)
从[1]开始:
在R参数中调用函数的语义是call-by-value。
这意味着参数在调用框架中进行评估并深度复制到函数评估环境中。 (只有例外是默认参数,有关详细信息,请参见[1]。)
[1] https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Argument-evaluation
答案 1 :(得分:1)
This question更详细地讨论了R&#39的复制修改机制; Hadley对函数here的解释包含一个与您非常相似的示例(请参阅&#39;返回值&#39;)。简短摘要是概念上的(并且从用户的角度出于所有实际目的),R 总是通过值传递参数。在幕后,如果一个翻译可以推断这样做是安全的,那么翻译可能会避免这种情况,但是应用程序员不能也不应该做出任何假设。