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

4 r function operators

我注意到有一些实例,其中算术运算符(在反引号中)就好像它是一个算术函数.

算术运算符:

> `+`(4, 5)
[1] 9
Run Code Online (Sandbox Code Playgroud)

算术函数:

> sum(4, 5)
[1] 9
Run Code Online (Sandbox Code Playgroud)

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

> `+`(1:5)
[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

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

42-*_*42- 11

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

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

>  `+`(-3:3)
[1] -3 -2 -1  0  1  2  3
> `+`(c(TRUE,FALSE))
[1] 1 0
Run Code Online (Sandbox Code Playgroud)

请注意,它并没有使所有的返回值的积极的在一个评论指出.

Next:二进制'+`运算符:

> `+`(-3:3, 0:6)
[1] -3 -1  1  3  5  7  9
Run Code Online (Sandbox Code Playgroud)

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

> sum(-3:3, 0:6, c(TRUE,FALSE) )
[1] 22
Run Code Online (Sandbox Code Playgroud)

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

> `+`(-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
Run Code Online (Sandbox Code Playgroud)

当对"并行"向量进行操作时,你经常会想要使用向量化运算符,并且对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
Run Code Online (Sandbox Code Playgroud)

其他人要求返回单个值.而像"mapply"这样的其他一些人在这个问题上是不可知的.

> mapply(sum, 1:4, 5:8)
[1]  6  8 10 12
> mapply("+", 1:4, 5:8)
[1]  6  8 10 12
Run Code Online (Sandbox Code Playgroud)

Vectorize可用于创建一个版本的非矢量化功能,并在内部它使用mapply返回不同的功能,但也仅限于非基本功能,因为它们没有在他们的形参列表中使用的参数名称(所以你不能向量化sum.)

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