在下一个调用函数中使中间变量可用

时间:2013-07-01 20:13:10

标签: r scope

这是一些示例代码:

a<-c(1,2); 
f1<-function(dataset){
        cat("a=",a,"\n");
        b<-rev(a);
        cat("b=",b,"\n");
        f2("b");}
f2<-function(dataset){ 
        print(exists(dataset));
        print(dataset); # do analysis on dataset b
}

输出:

> f1(a)
a= 1 2 
b= 2 1 
[1] FALSE
[1] "b"

如何在函数f2中使中间变量b可用(不更改属于某个包的函数f2)?

感谢。

2 个答案:

答案 0 :(得分:0)

我确实

> f1(a)
a= 1 2 
b= 2 1 
[1] TRUE
[1] "b"

然而在这种情况下我使用envir的{​​{1}}参数(即使属于某个包,你仍然可以改变它)

exists

如果你真的无法修改f2<-function(dataset){ print(exists(dataset, envir=envir=parent.frame())) print(dataset) # do analysis on dataset b } ,你必须“改进”f2 ......

f1

问题是,a<-c(1,2) f1<-function(dataset){ f2<-function(dataset){ print(exists(dataset, envir=parent.frame())) print(dataset) # do analysis on dataset b } cat("a=",a,"\n") b<-rev(a) cat("b=",b,"\n") f2("b") } > f1(a) a= 1 2 b= 2 1 [1] TRUE [1] "b" 在当前环境中查找名为“b”的对象(函数R本身)然后,如果找不到对象b,则进入“上层”......

此上级是在其中定义b的父级环境(在您的情况下为b),而.GlobalEnv不在b内。

f1内定义f2会使f1在进入R之前在b中寻找f1。我的第一个解决方案是使用.GlabalEnv,它明确要求parent.frame在调用R的环境中查找对象,这与父环境不同。

答案 1 :(得分:0)

我认为你在function2中有变量“b”,但它在全局空间中不存在。

“存在(”b“)”显示为FALSE,但在f2区域,b具有值并且可以处理。

a<-c(1,2);
f2<-function(dataset){ 
        print(dataset); # do analysis on dataset b
        return(dataset+1)
}

f1<-function(dataset){
        cat("a=",a,"\n");
        b<-rev(a);
        cat("b=",b,"\n");
        c <- f2(b);
        cat("c=",c,"\n");  
      }

f1(a)