Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 环境、(en)闭包和框架如何相关?_R_Function_Closures_Frame_Environment - Fatal编程技术网

R 环境、(en)闭包和框架如何相关?

R 环境、(en)闭包和框架如何相关?,r,function,closures,frame,environment,R,Function,Closures,Frame,Environment,我想更好地了解它们之间的关系。我知道函数闭包包含一个环境,环境包含一个框架和一个外壳,框架包含变量,但我对它们如何相互作用有点模糊 也许一个函数调用过程中发生的事情的例子会有所帮助?或者是一张图表?解决了您的问题吗 它有漂亮的图表,但没有小马 中也有一个描述,从p开始。417,或第8.9.1节。我认为上面的PDF虽然比较旧,但如果不是更多的话,也可能是同样有用的(因为图表)。《F&W》是一本好书,我以前读过很多次。FWIW,我在《简而言之R》一书中没有发现任何有用的见解。不过,我还没有钱伯斯的书

我想更好地了解它们之间的关系。我知道函数闭包包含一个环境,环境包含一个框架和一个外壳,框架包含变量,但我对它们如何相互作用有点模糊

也许一个函数调用过程中发生的事情的例子会有所帮助?或者是一张图表?

解决了您的问题吗

它有漂亮的图表,但没有小马


中也有一个描述,从p开始。417,或第8.9.1节。我认为上面的PDF虽然比较旧,但如果不是更多的话,也可能是同样有用的(因为图表)。《F&W》是一本好书,我以前读过很多次。FWIW,我在《简而言之R》一书中没有发现任何有用的见解。不过,我还没有钱伯斯的书。

UPDATER-lang将
环境定义为具有框架。我倾向于将帧看作堆栈帧,而不是从名称到值的映射,但是当然还有
data.frame
,它将列名映射到向量(然后是一些…)。我认为大部分的混乱来自于这样一个事实:最初的S语言(仍然是S-Plus)没有环境对象,所以所有的“框架”本质上就是现在的环境对象,只是它们只能作为调用堆栈的一部分存在

例如,在S-Plus中,
sys.nframe
的文档说“sys.nframe返回所有帧列表中当前帧的数字索引”…这听起来非常像堆栈帧。。。您可以在此处阅读有关堆栈帧的更多信息:

我扩展了下面的一些解释,并一致地使用术语“堆栈框架”(我希望如此)

结束更新

我会这样解释:

  • 环境是将变量名映射到值的对象。每个映射称为绑定。价值可以是实际价值,也可以是承诺。环境具有父环境(空环境除外)。在环境中查找符号但未找到时,也会搜索父环境

  • 承诺是一个未计算的表达式,也是一个计算表达式的环境。当对承诺进行评估时,它将替换为生成的值

  • 闭包是一个函数和定义该函数的环境。类似于
    lm
    的函数将具有stats命名空间环境,而用户定义的函数将具有全局环境-但是在另一个函数
    g
    中定义的函数
    f
    将具有
    g
    的本地环境作为其环境

  • 堆栈帧(或激活记录)表示调用堆栈上的条目。每个堆栈帧都有执行函数的本地环境和函数调用的表达式(以便
    sys.call
    工作)

  • 执行函数调用时,将创建一个本地环境,并将其父环境设置为闭包的环境,参数将与函数的形式参数匹配,并且这些绑定将添加到本地环境(作为承诺)。不匹配的形式参数被指定函数(如果有)的默认值(承诺),并标记为缺失。然后使用此本地环境和调用表达式创建堆栈帧。堆栈帧被推送到调用堆栈上,然后在本地环境中计算函数体

  • …因此,正文中的所有符号都将在局部环境(形式参数和局部变量)中查找,如果在父环境(即闭包环境)和父环境中找不到,则在找到之前一直查找

    请注意,在这种情况下,父堆栈帧的环境是未搜索的。
    parent.frame
    sys.frame
    函数获取调用堆栈上的环境,即调用方的环境和调用方的环境等

    # Here match.fun needs to look in the caller's caller's environment to find what "x" is...
    f <- function(FUN) match.fun(FUN)(1:10)
    g <- function() { x=sin; y="x"; f(y) }
    g() # same as sin(1:10)
    
    # Here we see that the stack frames must also contain the actual call expression
    f <- function(...) sys.call()
    g <- function(...) f(..., x=42)
    g(a=2) # f(..., x = 42)
    
    #此处match.fun需要查看调用者的调用者环境,以找到“x”是什么。。。
    
    f@DirkEddelbuettel:这不是谦虚;小马很乱。我没有读过。我会拿一份复印件回答我自己的问题。我的答案是否接近你想要的,或者我应该澄清其中的任何部分?谢谢你的回答。R-lang说,环境由一个框架(由符号/值绑定组成)和一个外壳(父环境?)组成,与#1稍有不同#因为R-lang和您在#1中的定义不同,以及R-lang如何用“评估框架”、“上下文”和“环境”等词来描述调用堆栈,所以第4条是令人困惑的。我不知道这是三件不同的事情,还是那一段的作者对术语太过随便。你的最后一段有点不清楚。再次感谢@我更新了我的答案。希望它能澄清一些事情(像泥一样清晰!)这个答案对我来说很有意义。谢谢