传递变量
问题描述:
我有以下两个功能:传递变量
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
但我宁愿避免全球分配(在实际的代码,我不希望有流浪全局对象.. )
所以问题是,我如何让fxt(在f1中定义)对f2可见?
感谢
(并且如果你不知道,现实生活中的F2比较复杂,使得传递变量的名称是有道理的;在任何情况下,它是由其他人创作的功能上,我无法控制,所以解决方案应该来自f1方)。
答
1)问题是真正与f2
,没有,所以f2
应该是固定的。通常会定义f2
以明确地传递环境。使用此代码f1
将按原样工作。
f2 <- function(where, envir = parent.frame()) {
eval(parse(text = where), envir = envir)*2` .
}
2)以下是较不理想;
f1 <- function() {
txt <- 1234
environment(f2) <- environment()
f2(where = "txt")
}
3)第三个选项是F1中定义F2:但是,如果我们没有控制权f2
那么我们就可以在f1
(现在在哪里f2
是持平的问题)做到这一点
f1 <- function(){
f2 <- function(where) eval(parse(text = where))*2
txt <- 1234
f2(where = "txt")
}
f1()
答
与f1
指定envir
论点eval
为parent.frame()
f2<-function(where){
foo<-eval(parse(text = where), envir= parent.frame())*2
return(foo)
}
f1()
#[1] 2468
非常好,谢谢! – jfmoyen
增加了第三个选项 –