如何声明匿名函数
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)
我想知道是否有简洁的方式处理声明匿名函数
说我想声明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)