我看到一些调用C代码的函数被描述为primitive
,internal
,builtin
或special
。这些功能是什么?
答案 0 :(得分:20)
这个问题混淆了两个截然不同的概念。 special
和builtin
是三种函数中的两种(以及closure
s),由typeof
确定。
来自R-ints, 1.5 Argument evaluation
作为特殊/内置是独立的或原始的 .Internal:quote是一个特殊的原语,+是内置的 原始的,cbind是一个特殊的.Internal和grep是内置的 。内部。
如果函数调用C代码,则builtin / special指的是在传递给C代码之前是否对其参数进行求值。
来自R-lang, 2.1.7 Builtin objects and special forms
内置函数对其所有参数进行求值和传递 内部功能,按照按值调用, 而特殊功能将未经评估的参数传递给 内部功能。
.Internal
和.Primitive
指的是用于调用C代码的接口。内部是标准方法,因为您可以在调用C代码之前检查R代码中的参数。原语是更高的性能,但不允许在函数中使用任何R代码。
来自R-ints, 2 .Internal vs .Primitive
在构建时编译为R的C代码可以直接调用 什么被称为基元或通过.Internal接口,哪个 除了语法之外,它与.External接口非常相似。更多 确切地说,R维护着一个R函数名称表 相应的C函数调用,按惯例全部启动 使用'do_'并返回SEXP。此表(文件中的R_FunTab src/main/names.c)还指定函数的参数数量 是否需要或允许,无论论证是否 在打电话之前评估,以及该功能是否为“内部” 在必须通过.Internal接口访问它的意义上, 或直接访问,在这种情况下,它在R中打印为 .Primitive。
通常使用包装在闭包中的.Internal()函数 首选,因为这确保了命名和默认的标准处理 参数。
然而,出于方便和效率的原因(因为那里) 使用.Internal接口包装的一些开销 函数闭包),原始函数是可以的异常 可以直接访问。