0

bind 関数を定義しました。

b <- function(f,...) function(x) f(x, ...)

だから私は次のようなことができます(これは偽の例です)

d = data.frame(x=c(1,2,1), y=c(10, 20, 5))
ddply(d, ~x, b(transform, y=sum(y)))

それ以外の

ddply(d, ~x, function (df) { transform(df, y=sum(y)) }

今、私は演算子を定義しようとしています

'%b%' <- function(x,...) b(x,...)

そして試してみてください

ddply(d, ~x, transform %b% (z=y*10)))

うまくいきません。違いはなんですか ?

私がする時

> b(transform, y=y/sum(y))(d)
x         y c.1..2..1.
1 1 0.2857143          1
2 2 0.5714286          2
3 1 0.1428571          1

それは機能しますが、

> transform %b% (y=y/sum(y))(d)
Error in transform %b% (y = y/sum(y))(d) : object 'y' not found

「キャプチャ」の違いがあることは理解しています。どうすればよいですか?

4

1 に答える 1

2

例を機能させるには、次を使用して、関数の引数を既存の関数に一致させる必要がありますmatch.fun()

`%b%` <- function(x,...) match.fun(b)(x,...)
ddply(d, ~x, transform %b% (z=y*10))

  x  y
1 1 10
2 1  5
3 2 20

match.fun()の最初の定義で使用すると、より安全になりfます。

b <- function(f, ...) function(x) match.fun(f)(x, ...)
ddply(d, ~x, b(transform, y=sum(y)))
  x  y
1 1 10
2 1  5
3 2 20

あなたの質問に答えたので、なぜあなたがこれをしたいのか理解できないことを指摘しなければなりません.likeplyr関数ddplyと基本Rapply関数はすでにこれを行っているからです。

したがって、元の例を次のように簡単に記述します。

ddply(d, ~x, transform, y=sum(y))
  x  y
1 1 15
2 1 15
3 2 20

ddply(d, ~x, transform, y=y/sum(y))
  x         y
1 1 0.6666667
2 1 0.3333333
3 2 1.0000000

編集

あなたの質問をもう一度見てみました。関数定義で構文エラーが発生しただけです。これは、中置演算子で完全にうまく機能します。

'%b%' <- function(f,...) function(x) f(x, ...)
ddply(d, ~x, transform %b% (z=y*10))
  x  y
1 1 10
2 1  5
3 2 20
于 2012-06-26T11:18:12.160 に答える