提问人:mshaffer 提问时间:8/16/2022 最后编辑:Dharmanmshaffer 更新时间:3/11/2023 访问量:128
如何在函数中获取当前环境 THIS 的名称
How to get the name of the current environment THIS within a function
问:
看起来你可以让一个函数通过该操作透明地将数据传递回父函数。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 。a
calling
a
caller
calling
caller
assign
问题在代码中,在 中,我如何获得这个当前帧引用?caller
如果我有更复杂的嵌套,我该如何使用它?传给那可能已经有几个功能深了?这个引用你能在R中通过引用吗? 有一些讨论,但我没有完全在当前的框架引用下?envir
calling
caller
答:
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()
上一个:将指针传递到指针的行为很奇怪
评论
environment()
instruction;
instruction;
instruction; NULL