【问题标题】:modify variable within R function修改R函数中的变量
【发布时间】: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


【解决方案1】:

@Dason 展示了一些方法,但实际上 - 你不应该

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

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

但最近 R 中添加了称为引用类的新对象(它们使用环境)。他们可以修改其值(但以受控方式)。如果你真的觉得有必要,你可能想考虑使用它们......

【讨论】:

【解决方案2】:

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

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

给出输出

[1] 5

【讨论】:

  • @joran 没有什么比在大约 8 年后被叫出来让一个人在 SO 上有宾至如归的感觉。但是,是的,你是对的。我向他们投了赞成票。但我真的很想对自己和他们的回答投反对票,把整个问题都烧到地上。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我认为@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. x 指向的值与 g 指向的值相同。
    4. 然后x指向5
    5. 函数返回指针x
    6. g 现在指向的值与返回时 x 指向的值相同。

    因此,不是大量不必要地复制大选项。

    我希望有人可以确认/纠正这一点。

    【讨论】:

    • 有趣!我很想知道这是否正确。在我的程序中,它的 df 大约是一个 gig,随着我的 RAM 使用量增长得相当大,似乎 df 被复制了好几次
    • @Alex:在这种情况下,是的 - 但只是因为它是微不足道的。如果您修改大矢量的一部分,通常(但不总是)复制它。 x &lt;- runif(1e6); y &lt;- x; x[4] &lt;- 42 进行复制,以便 xy 现在不同。
    【解决方案5】:

    我是否遗漏了为什么你不能这样做?

    g <- abc(g)
    

    【讨论】:

    • abc 稍作修改,使其实际返回一个值,是的。
    • 可以的。关键是要修改函数中的值,但不要扔掉所有这些大对象并复制它们。
    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2012-02-06
    相关资源
    最近更新 更多