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

同じものを探している他の人のために見つけた最も近いものである答えを出しています。それは私が望んでいるものではないので、私は自分自身に答えを与えるつもりはありません。

関数を返す: 複数の関数をまとめたい場合、私が見つけた最も簡単な方法は、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

データを返す: いくつかのデータから開始し、一連の変換を介して送信するだけの場合 (私の当初の意図)、「Compose」関数の最初の関数は開始データであり、「Compose」の終了後に' 関数は、関数を呼び出すために括弧のペアを追加します。次のようになります。

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

' anonymousPipeData' は、一連の関数の結果であるデータです。最後の括弧のペアに注意してください。これが、R が関数ではなくデータを返す原因です。

于 2012-11-17T19:17:55.903 に答える
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 に答える