很抱歉没有在我的问题标题中更具体,但我不确定如何说出来。
我只是想了解函数声明在R中是如何工作的。
library(magrittr)
library(compiler)
fn1 <- function(x) {x + 1} %>% cmpfun()
fn2 <- (function(x) {x + 1}) %>% cmpfun()
fn1(1) # gives an error
fn2(1) # works as expected
为什么我需要围绕函数声明使用括号,以便fn2
起作用而fn1
不起作用?
如果function
与任何其他函数一样,那么为什么function
调用(如在函数声明中)不符合正常语法...在function
的帮助页面中,它的语法是:
function( arglist ) expr
return(value)
答案 0 :(得分:2)
这是一个优先问题:第一个声明等同于
fn1 = function(x) ({x + 1} %>% cmpfun())
也就是说,cmpfun
的结果调用{x + 1}
,而不是函数声明本身。
不幸的是我找不到这些优先级规则的文档,并且缺少R的正式语法意味着它的唯一来源是R源代码本身(或者,在这个简单的情况下,它的可观察的运行时行为)。
除此之外,你问
为什么函数调用(如在函数声明中)不符合正常语法
- 这在这里并不重要(为了你的问题, 遵守正常的语法)但原因是:因为function
,就像R中的其他一些东西一样(if
,for
,...),是一种遵循由语言定义的特殊语法的特殊形式。
答案 1 :(得分:2)
由于
case class NoDataAvailableException() extends Exception
[...]
Try(...) match {
case Success(f) => Success(f)
case Failure(_) => Failure(NoDataAvailableException())
}
与
相同fn1 <- function(x) {x + 1} %>% cmpfun()
就像文档说的那样:fn1 <- function(x) {
{x + 1} %>% cmpfun()
}
- 基本上function( arglist ) expr
之后的所有内容都被视为单个表达式。当有括号时,它知道何时“停止”表达式。
与
不同function(x)
更像是
fn2 <- (function(x) {x + 1}) %>% cmpfun()
所以第一个是定义一个函数,而第二个实际上是调用管道运算符。