【发布时间】:2012-01-15 05:36:21
【问题描述】:
如何修改传递给 R 函数的参数?在 C++ 中,这将通过引用传递。
g=4
abc <- function(x) {x<-5}
abc(g)
我希望将 g 设置为 5。
【问题讨论】:
-
我的感觉是 R 的做法是说 g = abc() 其中 abc 返回 5。为什么这个特定的语法?
标签: r function pass-by-reference arguments
如何修改传递给 R 函数的参数?在 C++ 中,这将通过引用传递。
g=4
abc <- function(x) {x<-5}
abc(g)
我希望将 g 设置为 5。
【问题讨论】:
标签: r function pass-by-reference arguments
@Dason 展示了一些方法,但实际上 - 你不应该!
R 的整个范式是“按值传递”。 @Rory 刚刚发布了处理它的正常方法 - 只需返回修改后的值...
环境通常是唯一可以在 R 中通过引用传递的对象。
但最近 R 中添加了称为引用类的新对象(它们使用环境)。他们可以修改其值(但以受控方式)。如果你真的觉得有必要,你可能想考虑使用它们......
【讨论】:
必须有更好的方法来做到这一点,但是......
abc <- function(x){eval(parse(text = paste(substitute(x), "<<- 5")))}
g <- 4
abc(g)
g
给出输出
[1] 5
【讨论】:
我有一个类似于@Dason 的解决方案,我很好奇是否有充分的理由不使用它,或者是否有我应该注意的重要陷阱:
changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}
【讨论】:
我认为@Dason 的方法是理论上的唯一方法,但实际上我认为 R 的方法已经做到了。
例如,当您执行以下操作时:
y <- c(1,2)
x <- y
x 实际上只是一个指向值c(1,2) 的指针。同样,当你这样做时
abc <- function(x) {x <- 5; x}
g <- abc(g)
这并不是说您花时间将g 复制到函数中,然后将结果复制回g。我认为 R 对代码做了什么
g <- abc(g)
是:
abc 设置了一个环境。x 的环境中创建了一个指针。x 指向的值与 g 指向的值相同。x指向5x
g 现在指向的值与返回时 x 指向的值相同。因此,不是大量不必要地复制大选项。
我希望有人可以确认/纠正这一点。
【讨论】:
x <- runif(1e6); y <- x; x[4] <- 42 进行复制,以便 x 和 y 现在不同。
我是否遗漏了为什么你不能这样做?
g <- abc(g)
【讨论】:
abc 稍作修改,使其实际返回一个值,是的。