R语言 如何在函数中获取当前环境THIS的名称

nzkunb0c  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(180)

看起来您可以使用assign操作让一个函数将数据透明地传递回父函数。

示例(设置)

calling = function()
    {
    a = 25;
    cat("\n ...CALLING... a = ", a, "\n");
    assign("a", a, envir=parent.frame(1) );  # ?sys.calls
    }

caller = function()
    {
    a = 15;
    cat("\n ...CALLER... a = ", a, "\n");
    
    pf = parent.frame(); ## how to say THIS current FRAME
    cat("\n ...CALLER_FRAME... pf = \n");
    print(pf);
    
    cat("\n\n\n");
    
    calling();
    cat("\n ...CALLER*... a = ", a, "\n");
    }

跑步

a = 5;
cat("\n ...GLOBAL... a = ", a, "\n");
caller();
# scope, should mess with GLOBAL = 5
cat("\n ...GLOBAL*... a = ", a, "\n");

输出

> a = 5;
> cat("\n ...GLOBAL... a = ", a, "\n");

 ...GLOBAL... a =  5 
> caller();

 ...CALLER... a =  15 

 ...CALLER_FRAME... pf = 
<environment: R_GlobalEnv>



 ...CALLING... a =  25 

 ...CALLER*... a =  25 
> # scope, should mess with GLOBAL = 5
> cat("\n ...GLOBAL*... a = ", a, "\n");

 ...GLOBAL*... a =  5

问题

因此,在上面,GLOBAL a没有改变,但是calling能够更新callera的值,而不返回该值,也就是说,calling使用assign将该值传递回caller
问题是在代码中,在caller中,我如何获得THIS当前帧参考?
如果我有更复杂的嵌套,我该如何使用它?将envir传递给calling,这可能是一些函数的深度?这个参考Can you pass-by-reference in R?有一些讨论,但我没有完全在THIS当前的caller框架参考下?

plicqrtu

plicqrtu1#

正如@zephryl所说,environment()返回当前活动的环境,可以这样编写calling()函数:

calling <- function(envir = parent.frame()) {
  a <- 25
  assign("a", a, envir = envir)
}

然后默认情况下它会在调用者中赋值,但是如果你指定了envir参数,它会在调用者中赋值。
然后你可以这样做:

myenv <- new.env()
calling(envir = myenv)
myenv$a
#> [1] 25

在一个自定义的环境中进行赋值。如果你这样写caller()

caller <- function() {
  a <- 2
  calling(envir = environment())
  cat("in caller, a=", a, "\n")
}
a <- 1
caller()
#> in caller, a= 25
print(a)
#> [1] 1

它就像

caller2 <- function() {
  a <- 3
  calling()
  cat("in caller2, a=", a, "\n")
}

a <- 4
caller2()
#> in caller2, a= 25
print(a)
#> [1] 4

因为当评估caller()时,environment()给出对活动环境的引用,而当评估calling()时,parent.frame()指向调用者的环境,这是相同的事情。

相关问题