我有以下两个功能:
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方面。
答案 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()