通过环境传递变量

时间:2015-11-05 10:12:29

标签: r

我有以下两个功能:

f1<-function(){
txt<-1234
f2(where="txt")
}

f2<-function(where){
foo<-eval(parse(text = where))*2
return(foo)
}

当调用f1()时,我希望它返回2468.但是

> f1()
Error in eval(expr, envir, enclos) : object 'txt' not found

我不明白为什么,具体为什么f2不知道txt。当然它没有在自己的环境中定义,但它是在调用者环境中定义的(在f1中),我认为f1中定义的所有内容都应该对f2可见?

当然,如果在f1我有

txt<<-1234

然后

> f1()
[1] 2468

但我宁愿避免全局分配(在实际代码中,我不希望有杂散的全局对象......)

所以问题是,如何使txt(在f1中定义)对f2可见?

由于

(如果你想知道,现实生活中的f2更复杂,这样传递一个变量的名称是有意义的;无论如何它是由我无法控制的其他人写的函数,所以解决方案应该来自f1方面。

2 个答案:

答案 0 :(得分:2)

envir中的eval参数指定为parent.frame()

f2<-function(where){
    foo<-eval(parse(text = where), envir= parent.frame())*2
   return(foo)
 }

f1()
#[1] 2468

答案 1 :(得分:2)

1)问题实际上是f2,而不是f1,因此应修复f2。通常会定义f2以明确传递环境。使用此代码f1将按原样运行。

f2 <- function(where, envir = parent.frame()) {
  eval(parse(text = where), envir = envir)*2` .  
}

2)以下是不太理想的;但是,如果我们无法控制f2,那么我们可以在f1中执行此操作(现在f2与问题相同):

f1 <- function() {
   txt <- 1234 
   environment(f2) <- environment()
   f2(where = "txt")
}

3)第三个选项是在f1中定义f2:

f1 <- function(){
   f2 <- function(where) eval(parse(text = where))*2
   txt <- 1234
   f2(where = "txt")
}
f1()