我已经定义了一个绑定函数,
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
据我所知,存在“捕获”差异,我该怎么办?
答案 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