算术运算符是否优于算术函数?

时间:2014-12-08 17:28:10

标签: r function operators

我注意到有些情况下算术运算符(在反引号中)就好像它是一个算术函数。

算术运算符:

> `+`(4, 5)
[1] 9

算术函数:

> sum(4, 5)
[1] 9

然而算术运算符并没有像典型的算术函数那样在矢量中实现这一点:

> `+`(1:5)
[1] 1 2 3 4 5

是否有任何算术运算符优于算术函数的实例?

1 个答案:

答案 0 :(得分:11)

对于标题中的问题,我会说..或通常。在R中,我们经常并行地处理列或向量,即,在作为相同情况或主题的一部分的意义上的向量物质中的值的顺序。在您的示例中,您实际上看到了三种不同的功能:

首先:一元' +'运算符在给定数字向量时基本上什么也不做,但在给定逻辑向量时会对数字强制执行:

>  `+`(-3:3)
[1] -3 -2 -1  0  1  2  3
> `+`(c(TRUE,FALSE))
[1] 1 0

请注意,使其所有返回值均为正值,如其中一条评论中所述。

下一步:二进制' +`运算符:

> `+`(-3:3, 0:6)
[1] -3 -1  1  3  5  7  9

最后:sum函数,它是_not_vectorized_并将所有值折叠为其并集的总和:

> sum(-3:3, 0:6, c(TRUE,FALSE) )
[1] 22

二进制文件+也将回收参数(带警告):

> `+`(-3:3, c(TRUE,FALSE) )
[1] -2 -2  0  0  2  2  4
Warning message:
In -3:3 + c(TRUE, FALSE) :
  longer object length is not a multiple of shorter object length

在矢量"并行"你经常会想要使用向量化运算符,并且对sum的结果非常失望,它只能返回长度为1的值。像outer这样依赖于函数参数的函数需要对函数进行向量化。

>  outer(1:4, 5:8, sum)
Error in outer(1:4, 5:8, sum) : 
  dims [product 16] do not match the length of object [1]
> outer(1:4, 5:8, "+")
     [,1] [,2] [,3] [,4]
[1,]    6    7    8    9
[2,]    7    8    9   10
[3,]    8    9   10   11
[4,]    9   10   11   12

其他人要求返回单个值。还有一些像“mapply”这样的人对这个问题不可知。

> mapply(sum, 1:4, 5:8)
[1]  6  8 10 12
> mapply("+", 1:4, 5:8)
[1]  6  8 10 12

Vectorize可用于创建非向量化函数的版本,在内部使用mapply来返回不同的函数,但它仅限于非基本函数,因为它们可以不要在其形式列表中使用参数名称(因此您无法向量化sum。)

最后应该注意,这些优先级不同,可以通过咨询?Syntax获得R优先规则。 (一元算术运算符的优先级高于二进制算子。函数和括号隐含地具有最高优先级。我已经看到由于用户定义函数的优先级较高而出现意外情况。)