内置函数和闭包在R语言中的应用

4

我不确定这是否是问主观性问题的正确地方,而且我对R语言比较新,但现在非常困惑。我正在研究R语言参考资料,并通过在R提示符上运行typeof(is.na)typeof(mean)来找到两个对象,它们分别返回"builtin"和"closure"。我不知道这是什么意思,我在搜索后来到了这个网站http://www.r-bloggers.com/closures-in-r-a-useful-abstraction/,但是无法理解,请问有人能以通俗易懂的方式帮我理解"closure"和"builtin"吗?

2个回答

7

来自help("closure"):

这种类型的函数并不是R中唯一的类型:它们被称为闭包(源自LISP的名称),以区别于原始函数。

来自help(".Primitive"):

一个“原始”(内部实现)函数。

“内部实现”只是“内置”的另一个术语。

闭包和原始函数都是R中的函数。原始函数仅在C中实现(具有特殊的调用机制),闭包则主要在R中实现。

它们之间的另一个区别是,闭包总是与环境相关联(请参见语言定义)。这实际上几乎就是“闭包”的定义


1
这是否意味着闭包是使用R语法编写的,而内置函数是使用C编程语言编写的? - PKumar
1
这是我的理解。然而,闭包也可以调用 C 代码。例如,如果你查看 mean.default 的代码,你会发现最终它调用了 .Internal(mean(x)) - Roland
在我的 R 控制台中,help("Primitive") 没有起作用,但是 help("primitive") 起作用了。R 是大小写敏感的。因此,上面不应该是 help("primitive") 吗? - Erdogan CEVHER
1
@ErdoganCEVHER这个答案已经有5年了。那时可能与现在不同。或者这是自动更正的错别字。 - Roland

3

函数闭包,或者简单地说,函数,由三个基本组件组成:形参、主体和环境。

环境,或更好的说法是封闭环境,是函数创建时所在的环境,函数会记住它...

> typeof(mean)
[1] "closure"
> environment(mean)
<environment: namespace:base>
> environment(function(x){x+1})
<environment: R_GlobalEnv>

相对于闭包而言,基本类型没有环境:

> typeof(sum)          
[1] "builtin"
> environment(sum)
NULL

实际上,闭包和原始函数在传递参数给内部函数的方式上有所不同。

如果我们想要检查一个函数是闭包还是原始函数,可以使用以下方法:

> is.primitive(sum)          
[1] TRUE
> is.primitive(mean)
[1] FALSE

为了支持你的陈述/声明,给出一个具体的例子会更有帮助和更好:闭包和原始值在传递参数到内部函数的方式上有所不同。 - Erdogan CEVHER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接