函数()是否在R";中起作用;不是";需要花括号吗?

函数()是否在R";中起作用;不是";需要花括号吗?,r,function,syntax,R,Function,Syntax,我最近在我的R教程中遇到了这个例子: sapply(list(runif (10), runif (10)), function(x) c(min = min(x), mean = mean(x), max = max(x)) 我的印象是,在function()-函数中,首先必须在括号中列出参数,然后在花括号中列出函数执行的操作 在本例中,有“no”的花括号,代码似乎仍在运行,这怎么可能呢?这是一个单独的语句,因此不需要任何括号 sapply(0:5, function(x) x +

我最近在我的R教程中遇到了这个例子:

sapply(list(runif (10), runif (10)), 
   function(x) c(min = min(x), mean = mean(x), max = max(x))
我的印象是,在function()-函数中,首先必须在括号中列出参数,然后在花括号中列出函数执行的操作


在本例中,有“no”的花括号,代码似乎仍在运行,这怎么可能呢?

这是一个单独的语句,因此不需要任何括号

sapply(0:5, function(x) x  + 5)
sapply(0:5, function(x) {
             x <- sequence(x)
             x1 <- x[x > 2]
             c(mean = mean(x1), min = min(x1))
             })
但是,如果函数需要多个语句,则每个语句可以在花括号内分开

sapply(0:5, function(x) x  + 5)
sapply(0:5, function(x) {
             x <- sequence(x)
             x1 <- x[x > 2]
             c(mean = mean(x1), min = min(x1))
             })

函数
是一个基本函数:

`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
作为旁注,
rlang
有一个很好的功能,可以获得一致的车身输出:

rlang::fn_body(mean)
# {
#   UseMethod("mean")
# }

除非你有一个单独的声明,否则你不需要它
function(x){x10];c(min=min(x1),mean=mean(x1))}
我要补充的是,即使只有一条语句,也通常认为包含括号是良好的编码实践。如果以后需要添加其他语句,括号已经在那里了。更不用说包含它们更一致,而且通常更可读。@qdread包含括号会对性能产生轻微影响