R:内存中存储的函数的形式在哪里?

R:内存中存储的函数的形式在哪里?,r,scope,arguments,function-definition,R,Scope,Arguments,Function Definition,当函数已定义但尚未调用时,是否存在没有默认值的形式?如果存在,它们是否存在于执行环境中,或者存在于函数定义所在的环境中,或者其他地方 如果一个函数已经定义但尚未调用,并且一个形式化函数已经被指定了一个默认值,那么该值是否存在?如果存在,它存在于什么环境中?如果默认表达式的计算结果为常量,是否已将形式值指定给该值,如果提供了值,则在调用函数时将覆盖该值?如果不是,在什么环境下(固定的)默认值位于定义时刻和调用函数之间 调用函数并将实际值或默认值分配给表单后,将其传递到正文中,并且如果需要确定范围和

当函数已定义但尚未调用时,是否存在没有默认值的形式?如果存在,它们是否存在于执行环境中,或者存在于函数定义所在的环境中,或者其他地方

如果一个函数已经定义但尚未调用,并且一个形式化函数已经被指定了一个默认值,那么该值是否存在?如果存在,它存在于什么环境中?如果默认表达式的计算结果为常量,是否已将形式值指定给该值,如果提供了值,则在调用函数时将覆盖该值?如果不是,在什么环境下(固定的)默认值位于定义时刻和调用函数之间


调用函数并将实际值或默认值分配给表单后,将其传递到正文中,并且如果需要确定范围和/或评估,表单是否继续存在?如果是这样,它们在什么环境中存在?

一旦函数的实例通过调用加载到内存中,函数的形式就作为对象存在于函数的环境中。在Advanced R中,Hadley Wickham将此环境称为。可以通过
pryr::address()
访问对象的内存位置

作为一个例子,我将使用我之前编写的代码的修改版本来说明约翰·霍普金斯大学课程第二次编程作业中
makeVector()
函数中的内存位置

…结果是:

> makeVector()$get()
Address of x argument is: 0x1103df4e0
Number of references to x is: 0
[1] 200
> 
正如我们从输出中看到的,
x
确实有一个内存位置,但是没有其他对象包含对它的引用。另外,
x
被设置为其默认值,即长度为1的向量的值为200

在对的回答中,我详细介绍了
makeVector()
环境中的对象


关于形式在内存中存在多长时间的问题,只要为存储函数的被调用实例而创建的环境在内存中,形式就存在。由于垃圾回收器对没有外部引用的对象进行操作,因此如果函数实例未保存到对象,则只要函数调用将结果返回到父环境,它就有资格进行垃圾回收

我不知道你在问我什么,问题是什么似乎很清楚。本质上:如果你有类似于
funafaik的东西,它就不存在了。@HongOoi-Andrew的问题在John Chambers的引用中是有意义的:“为了理解R中的计算,有两个口号很有帮助:1)存在的一切都是对象,2)发生的一切都是函数调用。”如果R中的一切都是对象,函数的形式也必须是对象。因此,提出关于它们生存环境的问题是合理的。这个答案非常清楚,令人愉快。然而,我仍然不确定其中的一些细节。(1) “函数加载到内存后的环境”是否与执行环境相同?还是调用或封闭环境?还是别的什么?我一直认为形式和默认值是函数与外部世界的接口,它们位于自己的“中间”环境中,但我确信这是错误的。几乎可以肯定。(2)x的地址与makeVector的地址相同吗?和(续)(3)在定义函数时,调用函数时,或者在两者之间的某个时间,是否会将200赋值给0x1103df4e0?您的第一个回答是:这就是他们称为执行环境的环境,是吗?对不起,如果我把这个打到地上。我只是想确定我能把我从你们身上学到的东西和我认为我从哈德利的“高级R”中学到的东西联系起来。你的第二个回答是:行。我读了你的文章。非常好的一篇。@r2evans-在阅读了谢一辉关于
library()
require()
的文章后,我同意
library()
require()
更合适,尽管R文档中指出
require()
是用于R函数的。谢谢你坚持不懈地问我这个问题。不是说我花了几个小时在这个话题上夸夸其谈,而是。。。我认为
require
的唯一实际用途是当您有两个代码路径时:一个是当一个包可用时,另一个是其他情况,可能是由于速度/效率,可能是增加了功能。使用
,第二条路径被硬编码为
停止
。(和
if(!require(…)install.packages()
通常不应在生产中使用,可能仅在教程/演示中使用。)顺便说一句,我以前引用过这篇文章,写得很好。
makeVector()$get()
> makeVector()$get()
Address of x argument is: 0x1103df4e0
Number of references to x is: 0
[1] 200
>