这是一些示例代码:
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)?
感谢。
答案 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)