R 算术运算符比算术函数更可取吗?

R 算术运算符比算术函数更可取吗?,r,function,operators,R,Function,Operators,我注意到,在某些情况下,算术运算符(在backticks中)的行为就好像它是一个算术函数一样 算术运算符: > `+`(4, 5) [1] 9 > `+`(-3:3, 0:6) [1] -3 -1 1 3 5 7 9 算术函数: > sum(4, 5) [1] 9 然而,算术运算符并不像典型的算术函数那样跨向量完成此操作: > `+`(1:5) [1] 1 2 3 4 5 是否有任何实例表明算术运算符比算术函数更可取?对于标题中的问题,我会说..通常或典

我注意到,在某些情况下,算术运算符(在backticks中)的行为就好像它是一个算术函数一样

算术运算符:

> `+`(4, 5)
[1] 9
> `+`(-3:3, 0:6)
[1] -3 -1  1  3  5  7  9
算术函数:

> sum(4, 5)
[1] 9
然而,算术运算符并不像典型的算术函数那样跨向量完成此操作:

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

是否有任何实例表明算术运算符比算术函数更可取?

对于标题中的问题,我会说..通常或典型。在R中,我们经常并行处理列或向量,即向量中的值的顺序,从属于同一个案例或主题的意义上讲。在您的示例中,您实际上看到了三种不同的功能:

第一:一元“+”运算符,在给定数值向量时基本不做任何操作,但在给定逻辑向量时会强制执行数值:

>  `+`(-3:3)
[1] -3 -2 -1  0  1  2  3
> `+`(c(TRUE,FALSE))
[1] 1 0
请注意,它并没有像其中一条注释中所述的那样将所有返回值都设置为正值

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

> `+`(4, 5)
[1] 9
> `+`(-3:3, 0:6)
[1] -3 -1  1  3  5  7  9
最后是
sum
函数,它不是矢量化的,将所有值折叠为它们的并集之和:

> sum(-3:3, 0:6, c(TRUE,FALSE) )
[1] 22
二进制
+
还将循环使用参数(带有警告):

当“并行”操作向量时,您通常希望使用向量化运算符,并且对sum的结果非常失望,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
进行矢量化)


在结束语中可能需要注意的是,它们具有不同的优先级,可以通过查阅
?语法
,获得R优先级规则。(一元算术运算符的优先级高于二元算术运算符。函数和括号隐含地具有最高的优先级。我见过由于用户定义函数的优先级较高而出现意外的情况。)

我不理解这个问题。一元
+
运算符(与二进制运算符不同)的行为如文档所述。为什么您希望它的行为像
sum
?@Roland,如果在本例中
+
是一元运算符,那么它只需要一个操作数,这比求和中的操作数要少。