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

How to get the name of the current environment THIS within a function

提问人:mshaffer 提问时间:8/16/2022 最后编辑:Dharmanmshaffer 更新时间:3/11/2023 访问量:128

问:

看起来你可以让一个函数通过该操作透明地将数据传递回父函数。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 没有被更改,但能够在不返回值的情况下更新 for 的值。也就是说,将值传回 with 。acallingacallercallingcallerassign

问题在代码中,在 中,我如何获得这个当前帧引用?caller

如果我有更复杂的嵌套,我该如何使用它?传给那可能已经有几个功能深了?这个引用你能在R中通过引用吗? 有一些讨论,但我没有完全在当前的框架引用下?envircallingcaller

r OOP 参数 参数传递

评论

3赞 zephryl 8/16/2022
你只是想获得当前的环境吗? with no arguments 将返回当前环境。如果这不是你想要的,你能通过提供预期的输出来澄清你的问题吗?environment()
1赞 Rui Barradas 8/16/2022
R 不是 C,分号是指令分隔符。 是两条指令,.instruction;instruction;instruction; NULL

答:

1赞 user2554330 8/16/2022 #1

如@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()

评论

0赞 mshaffer 8/17/2022
我试图避免创建一个新的环境,一个在基础上构建的环境。所以和都是一回事吗?environment()parent.frame(1)parent.frame()
0赞 user2554330 8/17/2022
不。最后两个是相同的,但不同。它只是碰巧给出了与所描述的上下文相同的值。environment()parent.frame()