修改R函数中的变量

Posted

技术标签:

【中文标题】修改R函数中的变量【英文标题】:modify variable within R function 【发布时间】:2012-01-15 05:36:21 【问题描述】:

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

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

我希望将 g 设置为 5。

【问题讨论】:

我的感觉是 R 的做法是说 g = abc() 其中 abc 返回 5。为什么这个特定的语法? 【参考方案1】:

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

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

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

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

【讨论】:

还有proto 包。【参考方案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)

是:

    首先查看右侧。为函数abc 设置了一个环境。 在名为x 的环境中创建了一个指针。 x 指向的值与 g 指向的值相同。 然后x指向5 函数返回指针x g 现在指向的值与返回时 x 指向的值相同。

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

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

【讨论】:

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

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

g <- abc(g)

【讨论】:

abc 稍作修改,使其实际返回一个值,是的。 可以的。关键是要修改函数中的值,但不要扔掉所有这些大对象并复制它们。

以上是关于修改R函数中的变量的主要内容,如果未能解决你的问题,请参考以下文章

怎样一次性改变matlab中的某个变量?

R语言使用reshape包的rename函数修改数据变量的名称例如使用rename函数自定义修改dataframe数据列的名称

循环和函数式“批处理”

R中的方程式工具变量回归(控制函数)

R语言-环境变量设置

R中的全局变量和局部变量