我想知道是否有简明的方法来处理声明匿名函数
说我要声明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)}
当我{...}
为什么我需要{. %>% }
时,我看起来很虚伪
答案 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)