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

Function declaration in R and its evaluation?

抱歉,我的问题标题没有更具体,但我不确定如何措辞。

我只是想了解函数声明在 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 调用(如在函数声明中)不遵循正常语法...来自 [=14= 上的帮助页面],其语法为:

function( arglist ) expr
return(value)

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

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

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

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

除此之外,你问

why are not function calls (as in function declarations) obeying the normal syntax

— 这在这里并不真正相关(就您的问题而言,它 确实 遵守正常语法)但原因是:因为 function,例如R 中的一些其他东西(iffor、...)是一种特殊形式,它遵循由语言定义的特殊语法。

因为

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

相同
fn1 <- function(x) {
    {x + 1} %>% cmpfun()
}

就像文档所说的那样:function( arglist ) expr——基本上 function(x) 之后的所有内容都被视为单个表达式。当有括号时,它知道什么时候 "stop" 表达式。

不同于

fn2 <- (function(x) {x + 1}) %>% cmpfun()

哪个更像

fn2 <- `%>%`( function(x) {x + 1}, cmpfun())

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