【问题标题】:How can I declare an anonymous function如何声明匿名函数
【发布时间】:2017-07-13 10:34:49
【问题描述】:

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

假设我想声明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)} 之类的东西

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

【问题讨论】:

  • 你试过了吗? "a" %>% { . == "a"}
  • 我要声明一个不一样的函数,你自己试过了吗? f = {. == 'a'}
  • f(.=="a")("b") 做你想做的事。
  • @statquant 完成

标签: r magrittr


【解决方案1】:

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)

【讨论】:

  • 谢谢 Jarko 我不知道这个很酷的功能,但你不公平,它仍然适用于你的最后一个例子,你只需要输入f(x,apply(x, 1, sum))
  • @Moody_Mudskipper 嗯,没有意识到这行得通。我编辑了我的帖子:)
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2017-02-13
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多