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)