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 中的一些其他东西(if
、for
、...)是一种特殊形式,它遵循由语言定义的特殊语法。
因为
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())
所以第一个只是定义一个函数,而第二个实际上是调用管道运算符。
抱歉,我的问题标题没有更具体,但我不确定如何措辞。
我只是想了解函数声明在 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 中的一些其他东西(if
、for
、...)是一种特殊形式,它遵循由语言定义的特殊语法。
因为
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())
所以第一个只是定义一个函数,而第二个实际上是调用管道运算符。