修改R函数中的变量

时间:2011-12-07 17:38:35

标签: r function pass-by-reference arguments

如何修改传递给R中函数的参数?在C ++中,这将通过引用传递。

g=4
abc <- function(x) {x<-5}
abc(g)

我希望g设置为5。

5 个答案:

答案 0 :(得分:12)

@Dason表示有很多方法,但实际上 - 你不应该

R的整个范式是“通过价值”。 @Rory刚刚发布了处理它的正常方法 - 只返回修改后的值......

环境通常是唯一可以通过R中的引用传递的对象。

但是最近新的对象称为引用类已添加到R(它们使用环境)。他们可以修改他们的价值(但是以受控的方式)。如果您真的觉得有需要,可能需要考虑使用它们......

答案 1 :(得分:3)

必须有更好的方法来做到这一点,但......

abc <- function(x){eval(parse(text = paste(substitute(x), "<<- 5")))}
g <- 4
abc(g)
g

给出输出

[1] 5

答案 2 :(得分:1)

我认为@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)

是:

  1. 首先看右边。已设置功能abc的环境。
  2. 在该环境中创建一个名为x
  3. 的指针
  4. x指向g指向的相同值。
  5. 然后x指向5
  6. 该函数返回指针x
  7. g现在指向返回时x指向的相同值。
  8. 因此,存在大量不必要的大型选项复制。

    我希望有人可以确认/更正此事。

答案 3 :(得分:0)

我错过了为什么你不能这样做的事情?

g <- abc(g)

答案 4 :(得分:0)

我有一个类似于@Dason的解决方案,我很好奇是否有充分的理由不使用这个或者是否有重要的陷阱我应该注意:

changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}