R中的函数声明及其评估?

时间:2017-03-29 15:36:18

标签: r function magrittr

很抱歉没有在我的问题标题中更具体,但我不确定如何说出来。

我只是想了解函数声明在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)

2 个答案:

答案 0 :(得分:2)

这是一个优先问题:第一个声明等同于

fn1 = function(x) ({x + 1} %>% cmpfun())

也就是说,cmpfun的结果调用{x + 1},而不是函数声明本身。

不幸的是我找不到这些优先级规则的文档,并且缺少R的正式语法意味着它的唯一来源是R源代码本身(或者,在这个简单的情况下,它的可观察的运行时行为)。

除此之外,你问

  

为什么函数调用(如在函数声明中)不符合正常语法

- 这在这里并不重要(为了你的问题, 遵守正常的语法)但原因是:因为function,就像R中的其他一些东西一样(iffor,...),是一种遵循由语言定义的特殊语法的特殊形式。

答案 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()

所以第一个是定义一个函数,而第二个实际上是调用管道运算符。