function
является примитивной функцией:
`function`
.Primitive("function")
Второй аргумент - это тело, это функция цитирования, то есть этот второй аргумент не оценивается. Это эквивалентно:
fun1 <- function(x) x + 5
fun2 <- `function`(NULL, x + 5)
formals(fun2) <- alist(x=)
fun3 <- do.call( 'function', list(as.pairlist(alist(x=)), quote(x+5)))
identical(fun1,fun2)
[1] TRUE
identical(fun1,fun3)
[1] TRUE
См. Этот вопрос, объясняющий, почему мы не можем использовать функцию function
, как можем с другими: Как мне вызвать функцию `function`?
Синтаксис, используемый для fun1
: function(...) body
, где ...
будет отображен в список pairlist.
{
сама по себе является функцией. В отличие от (
, {
никогда не обрабатывается парсером.
Поэтому, когда в вашем выражении содержится один вызов, {
не требуется, не потому, что синтаксис function
разработан как гибкий, а потому, что он не является частью синтаксиса function
.
Я склонен согласиться с тем, что рекомендуется использовать фигурные скобки для согласованности, когда вы хотите использовать trace
, например, несоответствия раздражают. Это, как правило, имеет незначительные последствия, и не поддерживается базой R:
mean
# function (x, ...)
# UseMethod("mean")
# <bytecode: 0x000000000e146288>
# <environment: namespace:base>
body(mean)
# UseMethod("mean")
В качестве примечания rlang
имеет приятную функцию, позволяющую получить согласованный вывод тела:
rlang::fn_body(mean)
# {
# UseMethod("mean")
# }