以下两个是否等效,即它们是否定义了相同的函数?
function(df) {lm(mpg ~ wt, data=df)}
和
function(df) lm(mpg ~ wt, data=df)
特别是,我很困惑为什么可以在 R 中编写没有大括号的函数。
当函数定义超过一行时,是否只需要大括号来定义函数?
(也许是关于 R 和 Python 在技术上如何支持 C 中的分号,但使用它们被认为是不好的做法?)
这似乎可以解释为什么人们在定义匿名函数时通常不使用大括号,因为匿名函数通常很短,因此可以放在一行中,因此大括号不是必需的。
但是是否可以传递定义超过一行的匿名函数(显然这可能是不好的做法,但这不是我的观点)?
如果可能,那是否需要大括号?
最佳答案
您的示例与匿名函数无关。是关于{
和 }
如果它们之间只有一个表达式,则不需要。
- 表达式可以长于一行。
- 一行可以有多个表达式(用分号分隔)。
- 匿名函数不限于一行。
您可以找到 {
的文档像往常一样:help('{')
例子:
x <- 3; y <- 4; z <- x + y # more than one expression on a line
z <- x +
y +
2 # the expression x+y+2 extends over three lines
x <- matrix(1:30,3)
apply(x, 1, function(x) sd(x)/
median(x)) # anonymous function definition on two lines
有时必须小心代码中的换行符。在某些情况下,它们被解释器识别为句法单元的结尾。在这种情况下,“小心”是指:
给解释器一个在下一行搜索的理由 .
这将不起作用:
x <- 11:15
x
[3] # because of the linebreak it is not x[3]
但这会做:
x[
3
]
# the interpreter was searching for the ']' (till it was found)
这是我吸取教训的情况:
if (...) { ... }
else { ... } # unexpected 'else' !!!
从那时起,我以这种方式编码:
if (...) {
...
} else {
...
}
见 Unexpected 'else' in "else" error
A 非匿名函数 (即命名函数)只不过是通过赋值与对象名连接的函数定义:
fname <- function(...) ...
以备后用。您甚至可以在通常可以找到匿名函数的地方执行此操作:
x <- matrix(1:30,3)
apply(x, 1, FUN=(mysuperfunc <- function(x) sd(x)/median(x)) )
但这与更好的可读性相同:
mysuperfunc <- function(x) sd(x)/median(x)
x <- matrix(1:30,3)
apply(x, 1, FUN=mysuperfunc)
关于r - R中函数的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43618786/