【发布时间】:2017-07-24 06:14:00
【问题描述】:
Hadley 的新 pryr 包显示了变量的地址,非常适合分析。我发现,每当将变量传递给函数时,无论该函数做什么,都会创建该变量的副本。此外,如果函数体将变量传递给另一个函数,则会生成另一个副本。这是一个明显的例子
n = 100000
p = 100
bar = function(X) {
print(pryr::address(X))
}
foo = function(X) {
print(pryr::address(X))
bar(X)
}
X = matrix(rnorm(n*p), n, p)
print(pryr::address(X))
foo(X)
生成
> X = matrix(rnorm(n*p), n, p)
> print(pryr::address(X))
[1] "0x7f5f6ce0f010"
> foo(X)
[1] "0x92f6d70"
[1] "0x92f3650"
地址每次都会改变,尽管函数没有做任何事情。我对这种行为感到困惑,因为我听说 R 被描述为写入时复制 - 因此可以传递变量,但只有在函数想要写入该变量时才会生成副本。这些函数调用发生了什么?
为了最好的 R 开发,最好不要编写多个小函数,而是将内容全部放在一个函数中?我还在Reference Classes 上找到了一些讨论,但我看到很少有 R 开发人员使用它。还有另一种有效的方法来传递我缺少的变量吗?
【问题讨论】:
-
在我看来,这是
R最丑陋的缺点之一。您可以尝试使用environment来解决此问题。例如,请参阅讨论 here。 -
pryr 包不是新的。
标签: r