什么是原始,内部,内置和特殊功能?

Ric*_*ton 17 r r-faq

我已经看到,一些功能调用C代码被描述为primitive,internal,builtin,或special.这些功能是什么?

Ric*_*ton 22

这个问题混淆了两个不同的概念.special并且builtin是三种类型的函数中的两种(与closures一起),由...确定typeof.

R-ints,1.5论证评估

是一个特殊的/内置的是原始的或.internal:quote是一个特殊的原语,+是一个内置的原语,cbind是一个特殊的.Internal和grep是一个内置的.Internal.

内置与特殊

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

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

内置函数根据call-by-value计算所有参数并将其传递给内部函数,而特殊函数将未评估的参数传递给内部函数.

内部与原始

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

来自R-ints,2.Internal与.Primitive

在构建时编译为R的C代码可以直接在所谓的基元中调用,也可以通过.Internal接口调用,除了语法外,它与.External接口非常相似.更确切地说,R维护一个R函数名称表和相应的C函数来调用,按惯例,所有这些都以'do_'开头并返回SEXP.此表(文件 src/main/names.c中的R_FunTab)还指定需要或允许函数的参数数量,是否在调用之前评估参数,以及函数是否为"内部"的意义它必须通过.Internal接口访问,或者可以直接访问,在这种情况下,它在R中打印为.Primitive.

通常首选包含在闭包中的.Internal()函数,因为这确保了对命名和默认参数的标准处理.

但是,出于方便和效率的原因(因为使用函数闭包中包含的.Internal接口存在一些开销),原始函数是可以直接访问的异常.

  • @BhargavRao是的,我希望其他人改进它!如果它标记为"r-faq",那么获得社区满意的答案非常重要.我从其他答案中得到了很多分数. (6认同)