看起来您可以使用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
能够更新caller
的a
的值,而不返回该值,也就是说,calling
使用assign
将该值传递回caller
。
问题是在代码中,在caller
中,我如何获得THIS当前帧参考?
如果我有更复杂的嵌套,我该如何使用它?将envir
传递给calling
,这可能是一些函数的深度?这个参考Can you pass-by-reference in R?有一些讨论,但我没有完全在THIS当前的caller
框架参考下?
1条答案
按热度按时间plicqrtu1#
正如@zephryl所说,
environment()
返回当前活动的环境,可以这样编写calling()
函数:然后默认情况下它会在调用者中赋值,但是如果你指定了
envir
参数,它会在调用者中赋值。然后你可以这样做:
在一个自定义的环境中进行赋值。如果你这样写
caller()
:它就像
因为当评估
caller()
时,environment()
给出对活动环境的引用,而当评估calling()
时,parent.frame()
指向调用者的环境,这是相同的事情。