Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 函数与运算符的区别_R - Fatal编程技术网

R 函数与运算符的区别

R 函数与运算符的区别,r,R,我已经定义了一个绑定函数 b <- function(f,...) function(x) f(x, ...) 而不是 ddply(d, ~x, function (df) { transform(df, y=sum(y)) } 现在,我试图定义一个操作符 '%b%' <- function(x,...) b(x,...) 它不起作用。有什么区别 当我这样做的时候 > b(transform, y=y/sum(y))(d) x y c.1..2..1. 1

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

b <- function(f,...) function(x) f(x, ...)
而不是

ddply(d, ~x, function (df) { transform(df, y=sum(y)) }
现在,我试图定义一个操作符

'%b%' <- function(x,...) b(x,...)
它不起作用。有什么区别

当我这样做的时候

> 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

我明白,有一个“捕获”的区别,我能做什么?

要使示例正常工作,您需要使用
match.fun()将函数参数与现有函数匹配:


回答了您的问题后,我现在必须指出,我不明白您为什么要这样做,因为像
ddply
这样的
plyr
函数以及基本的R
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

编辑:

我又看了一眼你的问题。您只是在函数定义中犯了一个语法错误。这在中缀操作符中非常有效:

'%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

“%b%”谢谢,我没有意识到ddply和apply在什么地方像那样工作,谢谢你告诉我。无论如何,我仍然对答案感兴趣,因为我的示例只是一个简单的例子来说明问题I。但是,这并不能解释为什么它与函数而不是运算符一起工作。@mb14它实际上是这样的。看起来您在中缀运算符定义中犯了语法错误。答案已编辑。
`%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
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
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