【问题标题】:Syntax for functions in R?R中函数的语法?
【发布时间】:2017-04-25 18:54:49
【问题描述】:

以下两个是否等价,即它们是否定义了相同的功能?

function(df) {lm(mpg ~ wt, data=df)}

function(df) lm(mpg ~ wt, data=df)

特别是,我很困惑为什么可以在 R 中编写没有大括号的函数。

当函数定义超过一行时,是否只需要大括号来定义函数?

(也许是关于 R 和 Python 在技术上如何支持 C 中的分号,但使用它们被认为是不好的做法?)

这似乎可以解释为什么人们在定义匿名函数时通常不使用大括号,因为匿名函数通常很短,因此可以放在一行中,所以大括号不是必需的。

但是是否可以传递定义超过一行的匿名函数(显然这可能是不好的做法,但这不是我的意思)?

如果可能,是否需要大括号?

【问题讨论】:

  • @jogo 你说得对,谢谢你指出——已在编辑中修复
  • 关于“有没有可能”,你可以试试。例如,y = {x = 1; x + 2} 有效,您可以通过实验找出方法。正如 jogo 所说,大括号包裹着一个表达式,恰好在函数中很有用。
  • @jogo,请作为答案发布...

标签: r syntax


【解决方案1】:

您的示例与匿名函数无关。如果它们之间只有一个表达式,则不需要 {}
- 表达式可以长于一行。
- 一行中可以有多个表达式(以分号分隔)。
- 匿名函数不限于一行。

您可以像往常一样找到{ 的文档: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

非匿名函数(即命名函数)只不过是通过赋值与对象名连接的函数定义:

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)

【讨论】:

  • 您可能应该指出文档可用于 {.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2021-02-25
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多