传递变量

传递变量

问题描述:

我有以下两个功能:传递变量

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() 
+0

非常好,谢谢! – jfmoyen

+0

增加了第三个选项 –

f1指定envir论点evalparent.frame()

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

f1() 
#[1] 2468 
+0

它确实有效。但是在f1方面有没有解决方案(请参阅我原来的问题中的最后一句话,我没有在实际代码中控制f2)?另外 - 为什么?我认为默认行为是查看所有上游环境(从本地,到调用环境,到全球...)? – jfmoyen

+0

此外 - eval()的帮助文件变为“用法:eval(expr,envir = parent.frame()....”,所以parent.frame()应该是默认的,并且应该没有必要明确指定它? – jfmoyen