如何声明匿名函数

How can I declare an anonymous function

我想知道是否有简洁的方式处理声明匿名函数

说我想声明function(x){ return (x=='a') },我很想能够,我很想能够做到f <- {.=='a'}

我知道 magrittr 允许你做

library(magrittr)
{. %>% `==`(.,'a')} # or even . %>% `==`('a')  
{. %>% `==`(.,'a')}('b')
[1] FALSE

以同样的方式,如果 f = function(x,y,z){return(x+y+z)} 我想要 {f(.$x,3,.$z)}

当我有 {...} 为什么我需要 {. %>% } 它在我看来是虚假的

pryr 是一个包,它实现了这样的功能:

f() 获取一个表达式并尝试将其解析为一个函数。这并非在 100% 的情况下都能完美运行,因此绝对建议您检查生成的函数。

举个例子:

> pryr::f(.=="a")
function (.) 
. == "a"

直接调用如下:

> f(.=="a")("b")
[1] FALSE
> f(.=="a")("a")
[1] TRUE

这适用于多个参数:

> f(a+b+c)
function (a, b, c) 
a + b + c

> f(a+b+c)(1,2,3)
[1] 6

什么时候不行?

当不直接调用函数名时,

f() 似乎无法区分变量名和函数名。以下面的函数为例:

function(x){
  apply(x, 1, sum)
}

这里sum被解释为一个变量,所以解析为匿名函数中的一个参数:

> f(apply(x, 1, sum))
function (sum, x) 
apply(x, 1, sum)

这可以通过在调用中显式传递函数的预期参数来解决:

> f(x, apply(x, 1, sum))
function (x) 
apply(x, 1, sum)