如何声明匿名函数

时间:2017-07-13 10:34:49

标签: r magrittr

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

说我要声明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)}

之类的话

当我{...}为什么我需要{. %>% }时,我看起来很虚伪

1 个答案:

答案 0 :(得分:2)

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)