0

这是一些示例代码:

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"

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

谢谢。

4

2 回答 2

0

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

"exist("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)
于 2013-07-02T18:34:33.893 回答
0

我确实得到

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

但是在这种情况下,我使用的envir参数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"

问题是,在当前环境(函数本身)R中查找名为“b”的对象,然后,如果没有找到对象,则进入“上”级别......bb

这个上层b是定义在里面的父环境(在你的情况下是.GlobalEnv),并且b不在里面,而是在里面f1

定义f2insidef1使得在进入. R_ 我的第一个解决方案使用了,它明确要求在被调用的环境中查找对象,这是与父环境不同的概念。bf1.GlabalEnvparent.frameRf2

于 2013-07-01T20:20:52.543 回答