R - 将变量从函数传递给GlobalEnv

时间:2014-08-16 13:51:46

标签: r

我编写了一个脚本来设置一些输入变量然后运行几个函数,这些函数都应该访问和修改输入变量。我举一个简化的例子:

a <- 10
b <- 4
c <- 23
d <- 21
function1() {
    a <- a-2
    d <- d/2
}
function2() {
    b <- a+b
    c <- c+b/d
}

但是a,b,c和c中的更改不是写在GlobalEnv中,而是写在函数的LocalEnv中,因此更改不会“推送”到特定函数中。 我已经找到了几种在SO上实现这一点的方法,比如使用“asign()”或“&lt;&lt; - ”运算符(这似乎是不好的选择)。那么最好的方法是什么,哪种方式最少?我担心我必须改变剧本中的所有功能......

提前致谢!

`

2 个答案:

答案 0 :(得分:0)

简短回答(根据我个人意见)是:不要。

这是功能的一大优点,它们不会改变其领域之外的任何内容。通过更改另一个环境中的对象,这个优势完全无效。

如果您正在寻找自动更新R对象内容的方法,请使用for。如果您正在寻找以自动方式创建对象的方法,请使用assign(例如,在循环中,在同一环境中运行)。

这里的问题与这样的&#34;未公开的&#34;相同。功能:它们可以更改您不打算更改的变量,或者它们可能会使您不真正需要的对象混乱您的工作区。通常最好的方法是寻找能够更有效地实现同样目标的替代方案。

答案 1 :(得分:0)

更好的方法是:

a <- 10
b <- 4
c <- 23
d <- 21
function1<- function() {  # Not really wild about  argument-less functions
     a <- a-2
     d <- d/2
     list(a,d)
 }

 res1 <- function1()

function2 <- function(lis) { # really do need an argument here
     b <- lis[[1]]+b
     c <- c+b/lis[[2]]
     list(b,c)
 }
> res2 <- function2(res1)
> res2
[[1]]
[1] 12

[[2]]
[1] 24.14286

您需要停止假设所有内容都在本地工作空间中并开始传递参数并将结果返回到新名称。