2

我有一个问题是另一个问题的延伸。

我希望能够管道匿名函数。在上一个问题中,管道定义函数的答案是创建一个管道运算符 "%|>%" 并以这种方式定义它:

"%|>%" <- function(fun1, fun2){
              function(x){fun2(fun1(x))}
}

这将允许您调用一系列函数,同时不断地将前一个函数的结果传递给下一个函数。需要注意的是要预定义的功能。现在我试图弄清楚如何使用匿名函数来做到这一点。之前使用预定义函数的解决方案如下所示:

square <- function(x){x^2}
add5 <- function(x){x + 5}

pipelineTest <-
  square %|>%
  add5

这给了你这种行为:

> pipelineTest(1:10)
 [1]   6   9  14  21  30  41  54  69  86 105

我希望能够pipelineTest用这样的匿名函数定义函数:

anonymousPipelineTest <-
  function(x){x^2} %|>%
  function(x){x+5} %|>%
  x

当我尝试使用与上述相同的参数调用它时,我得到以下信息:

> anonymousPipelineTest(1:10)
function(x){fun2(fun1(x))}
<environment: 0x000000000ba1c468>

我希望得到的结果与pipelineTest(1:10). 我知道这是一个微不足道的例子。我真正想要的是一种管道匿名函数的方法。谢谢您的帮助!

4

3 回答 3

4

使用 Compose 并调用结果函数会给出:

"%|>%" <- function(...) Compose(...)()

现在摆脱'x'作为最终的“功能”(替换为实际功能,这不是必需的,但例如在这里):

anonymousPipelineTest <-
     function(x){x^2} %|>%
     function(x){x+5} %|>% function(x){x}
anonymousPipelineTest(1:10)

[1]   6   9  14  21  30  41  54  69  86 105
于 2012-11-17T18:52:38.553 回答
0

?funprog这是帮助页面上提供的示例的应用程序:

Funcall <- function(f, ...) f(...)
anonymousPipelineTest <- function(x) Reduce( Funcall, list(
    function(x){x+5}, function(x){x^2}), 
    x, right=TRUE)
 anonymousPipelineTest(1:10)
 #[1]   6   9  14  21  30  41  54  69  86 105
于 2012-11-17T18:23:37.783 回答
0

我正在提出一个答案,这是我为寻找相同事物的其他人找到的最接近的答案。不过,我不会给自己点答案,因为这不是我想要的。

返回一个函数: 如果你想把几个函数放在一起,我发现最简单的方法是使用 R 的“Functional”包中的“Compose”函数。它看起来像这样:

anonymousPipe <- Compose(
  function(x){x^2},
  function(x){x+5})

这允许您像这样调用这一系列函数:

> anonymousPipe(1:10)
 [1]   6   9  14  21  30  41  54  69  86 105

返回数据: 如果您只想从一些数据开始并通过一系列转换(我的初衷)将其发送,那么“撰写”函数中的第一个函数应该是您的起始数据,并且在“撰写”结束之后' 函数添加一个括号对来调用该函数。它看起来像这样:

anonymousPipeData <- Compose(
  seq(1:10),
  function(x){x^2},
  function(x){x+5})()

' anonymousPipeData' 现在是一系列函数的结果数据。请注意末尾的一对括号。这就是导致 R 返回数据而不是函数的原因。

于 2012-11-17T19:17:55.903 回答