Я видел, что некоторые функции, которые вызывают C-код, описываются как primitive
, internal
, builtin
или special
. Каковы эти функции?
Что такое примитивные, внутренние, встроенные и специальные функции?
Ответ 1
Этот вопрос объединяет два разных понятия. special
и builtin
являются двумя из трех типов функций (вместе с closure
s), как определено typeof
.
Из R-ints, 1.5 Аргумент оценки
являющийся специальным/встроенным, отличается от примитивного или .Internal: quote - специальный примитив, + встроенный примитивный, cbind - специальный. Внутренний и grep - встроенный .Internal.
Встроенный и специальный
Если функция вызывает C-код, builtin/special ссылается на то, оцениваются ли ее аргументы перед передачей C-коду.
От R-lang, 2.1.7 Встроенные объекты и специальные формы
Встроенные функции имеют все свои аргументы, которые оцениваются и передаются к внутренней функции, в соответствии с позывным, тогда как специальные функции передают неоцененные аргументы внутренняя функция.
Внутренний и примитивный
.Internal
и .Primitive
относятся к интерфейс, используемый для вызова C-кода. Внутренний стандарт является стандартным, поскольку вы можете проверять аргументы в R-коде перед вызовом C-кода. Примитив имеет более высокую производительность, но не позволяет использовать R-код в функции.
От R-ints, 2. Внутри против .Primitive
C-код, скомпилированный в R во время сборки, может быть вызван непосредственно в что называют примитивами или через внутренний интерфейс, который очень похож на внешний интерфейс, кроме синтаксиса. Больше точно, R поддерживает таблицу имен функций R и соответствующие функции C для вызова, которые по соглашению все начинают с 'do_ и возвратите SEXP. Эта таблица (R_FunTab в файле src/main/names.c) также указывает, сколько аргументов функции требуются или разрешены, должны ли аргументы быть или нет оценивается до вызова, и является ли функция внутренней в том смысле, что к нему необходимо получить доступ через внутренний интерфейс, или непосредственно доступным, и в этом случае он печатается в R как .Primitive.
Функции, использующие .Internal(), завернутые в закрытие, вообще предпочтительнее, поскольку это обеспечивает стандартную обработку названных и дефолтных Аргументы.
Однако, по соображениям удобства и эффективности (так как там это некоторые накладные расходы при использовании внутреннего интерфейса, завернутого в закрытие функции), примитивные функции являются исключениями, которые могут доступ к ним осуществляется напрямую.