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

时间:2016-11-14 15:28:19

标签: r r-faq

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

1 个答案:

答案 0 :(得分:20)

这个问题混淆了两个截然不同的概念。 specialbuiltin是三种函数中的两种(以及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接口包装的一些开销   函数闭包),原始函数是可以的异常   可以直接访问。