与R中的作用域/参数传递混淆

时间:2016-07-22 07:22:05

标签: r

嗨跑了以下几行,有点惊讶。混乱内联:

好的,我创建一个列表:

> 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和参数传递文档,但无法解决这个问题。在调用函数体之前,列表是深度还是浅度复制?

2 个答案:

答案 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 总是通过值传递参数。在幕后,如果一个翻译可以推断这样做是安全的,那么翻译可能会避免这种情况,但是应用程序员不能也不应该做出任何假设。