Я пытаюсь вызвать функцию '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'?
Просто чтобы уточнить: существуют тривиальные обходные пути (в этом вопросе перечислено два, а по крайней мере третий). Но я хотел бы понять, как это (не) работает.