函数()是否在R";中起作用;不是";需要花括号吗?
我最近在我的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 +
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包含括号会对性能产生轻微影响