gpt4 book ai didi

r - 环境、(en)closures 和框架是如何相关的?

转载 作者:行者123 更新时间:2023-12-03 22:01:11 24 4
gpt4 key购买 nike

我想更好地了解 environments , closures , 和 frames有关系。我理解函数闭包包含一个环境,环境包含一个框架和一个外壳,框架包含变量,但我对它们如何相互交互有点模糊。

也许函数调用期间发生的事情的示例会有所帮助?或者也许是一个图表?

最佳答案

更新 R-lang 定义了一个 environment就像有一个框架。我倾向于将帧视为堆栈帧,而不是从名称到值的映射 - 但当然还有 data.frame它将列名映射到向量(然后是一些......)。我认为大部分的困惑来自于原来的 S 语言(仍然是 S-Plus)没有环境对象,所以所有的“框架”本质上都是现在的环境对象,除了它们只能作为一部分存在的调用堆栈。

例如,在 S-Plus 中,sys.nframe 的文档说“sys.nframe 返回所有帧列表中当前帧的数字索引。” ...在我看来,这听起来很像堆栈帧...您可以在此处阅读有关堆栈帧的更多信息:http://en.wikipedia.org/wiki/Call_stack#Structure

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

结束更新

我会这样解释它们:

  • 环境是将变量名称映射到值的对象。每个映射称为一个绑定(bind)。该值可以是真实值或 promise 。环境具有父环境(空环境除外)。当您在环境中查找符号但未找到时,也会搜索父环境。
  • Promise 是一个未计算的表达式和一个计算表达式的环境。当 promise 被评估时,它被替换为生成的值。
  • 闭包是一个函数和定义该函数的环境。像 lm 这样的函数将具有 stats 命名空间环境,而用户定义的函数将具有全局环境 - 但函数 f在另一个函数中定义 g将具有 g 的本地环境作为它的环境。
  • 堆栈帧(或激活记录)代表调用堆栈上的条目。每个堆栈帧都有执行函数的本地环境,以及函数调用的表达式(以便 sys.call 起作用)。
  • 执行函数调用时,会创建一个本地环境,并将其父设置为闭包的环境,将参数与函数的形式参数匹配,并将这些绑定(bind)添加到本地环境(作为 promise )。不匹配的形式参数被分配函数的默认值( promise )(如果有的话)并标记为缺失。然后使用此本地环境和调用表达式创建堆栈帧。堆栈帧被压入调用堆栈,然后在此本地环境中评估函数的主体。

  • ...因此,将在本地环境(形式参数和局部变量)中查找正文中的所有符号,如果在父环境(即闭包环境)和父环境的父环境中找不到,依此类推,直到找到.

    注意父栈帧的环境是 不是 在这种情况下进行了搜索。 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)

    关于r - 环境、(en)closures 和框架是如何相关的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903414/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com