我已经看到,一些功能调用C代码被描述为primitive
,internal
,builtin
,或special
.这些功能是什么?
Ric*_*ton 22
这个问题混淆了两个不同的概念.special
并且builtin
是三种类型的函数中的两种(与closure
s一起),由...确定typeof
.
是一个特殊的/内置的是原始的或.internal:quote是一个特殊的原语,+是一个内置的原语,cbind是一个特殊的.Internal和grep是一个内置的.Internal.
如果函数调用C代码,则builtin/special指的是在传递给C代码之前是否对其参数进行求值.
内置函数根据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接口存在一些开销),原始函数是可以直接访问的异常.