修改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 <- runif(1e6); y <- x; x[4] <- 42
进行复制,以便 x
和 y
现在不同。【参考方案5】:
我是否遗漏了为什么你不能这样做?
g <- abc(g)
【讨论】:
对abc
稍作修改,使其实际返回一个值,是的。
可以的。关键是要修改函数中的值,但不要扔掉所有这些大对象并复制它们。以上是关于修改R函数中的变量的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用reshape包的rename函数修改数据变量的名称例如使用rename函数自定义修改dataframe数据列的名称