38

R で構成演算子を作成できます。

 `%c%` = function(x,y)function(...)x(y(...)) 

このように使用するには:

 > numericNull = is.null %c% numeric
 > numericNull(myVec)
 [2] TRUE FALSE

しかし、この種のことやRでのカリー化などの他の操作を行うための公式の関数セットがあるかどうかを知りたいです。主に、これはコード内の括弧、関数キーワードなどの数を減らすためです。

私のカレー関数:

> curry=function(...){
    z1=z0=substitute(...);z1[1]=call("list");
    function(...){do.call(as.character(z0[[1]]),
                          as.list(c(eval(z1),list(...))))}}
> p = curry(paste(collapse=""))
> p(letters[1:10])
[1] "abcdefghij"

これは、たとえば集計に特に適しています。

> df = data.frame(l=sample(1:3,10,rep=TRUE), t=letters[1:10])
> aggregate(df$t,df["l"],curry(paste(collapse="")) %c% toupper)
  l    x
1 1  ADG
2 2  BCH
3 3 EFIJ

これは、次のものよりもはるかにエレガントで編集可能です。

> aggregate(df$t, df["l"], function(x)paste(collapse="",toupper(x)))
  l    x
1 1  ADG
2 2  BCH
3 3 EFIJ

基本的に私は知りたいです-これはすでにRで行われていますか?

4

4 に答える 4

28

これらの関数は両方とも、 Peter Danenbergroxygenパッケージ(ここのソース コードを参照) に実際に存在します (元々は R-Help の Byron Ellis のソリューションに基づいていました)。

Curry <- function(FUN,...) {
  .orig = list(...);
  function(...) do.call(FUN,c(.orig,list(...)))
}

Compose <- function(...) {
  fs <- list(...)
  function(...) Reduce(function(x, f) f(x),
                       fs,
                       ...)
}

関数の使用法に注意してくださいReduce。これは、R で関数型プログラミングを行うときに非常に役立ちます。詳細については、?Reduce を参照してください (これは、Mapやなどの他の関数もカバーしていますFilter)。

そして、カレーの例(この使用法では少し異なります):

> library(roxygen)
> p <- Curry(paste, collapse="")
> p(letters[1:10])
[1] "abcdefghij"

Compose以下は、 (文字に 3 つの異なる関数を適用する)の有用性を示す例です。

> Compose(function(x) x[length(x):1], Curry(paste, collapse=""), toupper)(letters)
[1] "ZYXWVUTSRQPONMLKJIHGFEDCBA"

そして、最後の例は次のようになります。

> aggregate(df[,"t"], df["l"], Compose(Curry(paste, collapse=""), toupper))
  l    x
1 1  ABG
2 2 DEFH
3 3  CIJ

最後に、同じことを行う方法を次に示します (または既に示したようplyrに簡単に行うこともできます)。byaggregate

> library(plyr)
> ddply(df, .(l), function(df) paste(toupper(df[,"t"]), collapse=""))
  l   V1
1 1  ABG
2 2 DEFH
3 3  CIJ
于 2010-02-09T14:16:50.433 に答える
2

roxygenパッケージに Curry という関数があります。R Mail Archive のこの会話
から見つかりました。

于 2010-02-09T14:15:58.910 に答える