什么是基元函数、内部函数、内置函数和特殊函数?[关闭]

What are primitive, internal, builtin, and special functions? [closed]

提问人:Richie Cotton 提问时间:11/14/2016 更新时间:11/14/2016 访问量:2714

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

4年前关闭。

我已经看到一些调用 C 代码的函数被描述为 、 、 或 。这些功能是什么?primitiveinternalbuiltinspecial

R-常见问题

评论


答:

26赞 Richie Cotton #1

这个问题混淆了两个不同的概念。 并且是 typeof 确定的三种函数类型(以及 s)中的两种。specialbuiltinclosure

来自 R-ints, 1.5 参数评估

作为特殊/内置与原始或 .内部:quote 是一个特殊的原语,+ 是一个内置的 原始的,cbind 是一个特殊的 .Internal 和 grep 是内置的 .内部。

内置与特殊

如果函数调用 C 代码,则 builtin/special 是指在传递给 C 代码之前是否对其参数进行计算。

R-lang, 2.1.7 内置对象和特殊形式

内置函数的所有参数都经过计算和传递 到内部函数,按照按值调用, 而特殊函数将未计算的参数传递给 内部功能。

内部与基元

。Internal.基元是指用于调用 C 代码的接口。Internal 是标准方法,因为您可以在调用 C 代码之前检查 R 代码中的参数。Primitive 是更高的性能,但不允许在函数中使用任何 R 代码。

来自 R-ints, 2 .内部与 .原始

在构建时编译成 R 的 C 代码可以直接在 什么称为基元或通过 .内部接口,其中 与 .外部接口(语法除外)。更多 准确地说,R 维护一个 R 函数名称和 要调用的相应 C 函数,按照约定,这些函数都启动 替换为“do_”并返回 SEXP。此表(R_FunTab在文件 src/main/names.c 中)还指定了函数的参数数 是必需的或允许的,无论参数是否是 在调用之前进行评估,以及函数是否为“内部” 从某种意义上说,它必须通过 .内部接口, 或直接访问,在这种情况下,它在 R 中打印为 .原始。

使用 的函数。封装在闭包中的 internal() 通常 首选,因为这可确保对 Named 和 Default 进行标准处理 参数。

但是,出于方便和效率的原因(因为那里 是使用 .内部接口包装在一个 函数闭包),原始函数是可以 可直接访问。

评论

0赞 Bhargav Rao 11/14/2016
你写了很棒的[r-faq]帖子,但你为什么要把它们变成community-wiki呢?你已经花了大量的时间和精力在这件事上,你为什么要否认作为对答案的赞成票的一部分给你的少量代表?或者你想向其他人发出信号,这就是我写的,请继续改进它
7赞 Richie Cotton 11/14/2016
@BhargavRao是的,我希望其他人改进它!如果它被标记了,那么有一个社区满意的答案是很重要的。我从其他答案中得到了很多分数。r-faq
0赞 Konrad Rudolph 7/28/2018
还有更多:一些基元在 R 中被定义为函数,其他基元则直接被定义为对象。您能详细介绍一下其中的区别吗?我试图找到一个解释,并在 R 中尝试它们,但不明白。例如,被定义为函数,而 和 不是(尽管是可调用的)。.Primitive​`+`​​`(`​return
0赞 Richie Cotton 7/29/2018
@KonradRudolph 这些东西都是功能。看一看和 .不知道为什么他们的打印方法只是说。is.function(`(`)is.function(return).Primitive()
0赞 Konrad Rudolph 7/29/2018
@RichieCotton 是的,这就是我所指的:当然,它们是函数,但它们的 R 定义看起来不像函数。实际上,这是另一种方式:返回一个函数。因此,我不明白(例如)是如何工作的:例如,如果我复制它的定义并将其分配给不同的变量,结果不起作用:返回。相比之下,如果我直接定义 ,它有效。那怎么办呢?此外,实际上在控制台中的打印方式略有不同。.Primitive(…)cx = function(...) .Primitive("c"); x(1, 2).Primitive("c")y = .Primitive("c")cxc