我注意到有些情况下算术运算符(在反引号中)就好像它是一个算术函数。
算术运算符:
> `+`(4, 5)
[1] 9
算术函数:
> sum(4, 5)
[1] 9
然而算术运算符并没有像典型的算术函数那样在矢量中实现这一点:
> `+`(1:5)
[1] 1 2 3 4 5
是否有任何算术运算符优于算术函数的实例?
答案 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优先规则。 (一元算术运算符的优先级高于二进制算子。函数和括号隐含地具有最高优先级。我已经看到由于用户定义函数的优先级较高而出现意外情况。)