Я пытаюсь вызвать функцию 'function'
чтобы определить функцию в коде R.
Как мы все знаем ™, 'function'
- это .Primitive
используется внутри R для определения функций, когда пользователь использует обычный синтаксис, т.е.
mean1 = function (x, ...) base::mean(x, ...)
Но ничто не мешает мне назвать этот примитив напрямую. Или я так думал. Я могу напрямую вызывать другие примитивы (и даже переопределять их; например, в момент безумия я отверг Rs, встроенный 'for'
). Так что это в принципе возможно.
И все же я не могу заставить его работать на 'function'
. Вот что я попробовал:
# Works
mean2 = as.function(c(formals(mean), quote(mean(x, ...))))
# Works
mean3 = eval(call('function', formals(mean), quote(mean(x, ...))))
# Error: invalid formal argument list for "function"
mean4 = 'function'(formals(mean), quote(mean(x, ...)))
Тот факт, что mean3
в частности работает, показывает мне, что mean4
должен работать. Но это не так. Зачем?
Я проверил определение примитива 'function'
в источнике R. do_function
определена в eval.c
И я вижу, что он вызывает CheckFormals
, который гарантирует, что каждый аргумент является символом, и это не удается. Но почему это проверяет, и что это значит?
И самое главное: есть ли способ прямого вызова примитива 'function'
?
Просто чтобы уточнить: существуют тривиальные обходные пути (в этом вопросе перечислено два, а по крайней мере третий). Но я хотел бы понять, как это (не) работает.