功能和操作员之间的区别

时间:2012-06-26 08:19:08

标签: r

我已经定义了一个绑定函数,

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

据我所知,存在“捕获”差异,我该怎么办?

1 个答案:

答案 0 :(得分: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

在回答了你的问题之后,我现在必须指出我不明白你为什么要这样做,因为plyr函数如ddply以及基础R {{1函数已经这样做了。

所以,我会像这样编写你原来的例子:

apply

修改

我再看看你的问题。您只是在函数定义中出现语法错误。这对中缀运算符完全正常:

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