R 使中间变量在下一个调用函数中可用
这是一些示例代码:R 使中间变量在下一个调用函数中可用,r,scope,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
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
}
如何使中间变量b在函数f2中可用(不改变属于某个包的函数f2)
谢谢。我确实收到了
> f1(a)
a= 1 2
b= 2 1
[1] TRUE
[1] "b"
但是在这种情况下,我使用exists
的envir
参数(即使属于某个包,也可以更改它)
问题是,R
在当前环境(函数b
本身)中查找名为“b”的对象,然后,如果未找到对象b
,则进入“上层”级别
此上层是定义了b
的父环境(在您的案例中是.GlobalEnv
),并且b
不在那里,而是在f1
内部
在f1
中定义f2
使R
在进入.GlabalEnv
之前在f1
中查找b
。我的第一个解决方案使用了parent.frame
,它明确要求R
在调用f2
的环境中查找对象,这与父环境是不同的概念 我认为函数2中有变量“b”,但它在全局空间中不存在
“exist”(“b”)“show 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)
a为什么不f2(b)
?你能解释一下b在f2
中如何可用吗?@JakeBurkhead f2是包中的comproc
函数(见下面的注释)。我不知道为什么不写f2(b),因为我没有写那个包。有没有可能不编辑某个包中存在的f2?使b在f2范围内可用。@user2540309是和否。。。唯一的方法是在f1
内部定义f2
。见edit@user2540309听起来你真的想做一些不该做的事。也许你能解释一下你的实际情况?您可能正在试图找到一个不应该存在的问题的解决方案,因为您的做法是错误的?@user2540309您可能也需要阅读此情况,即函数f2存在于一个包中,我更愿意保持不变。f1只是一个包装器,用于在将数据传递给f2进行压缩之前对数据进行转换。我知道一种方法是使用b
f2<-function(dataset){
print(exists(dataset, envir=envir=parent.frame()))
print(dataset) # do analysis on dataset b
}
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"
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)