算术运算符是不是比算术函数更可取?

Posted

技术标签:

【中文标题】算术运算符是不是比算术函数更可取?【英文标题】:Are arithmetic operators ever preferable to arithmetic functions?算术运算符是否比算术函数更可取? 【发布时间】:2015-02-06 10:22:36 【问题描述】:

我注意到在某些情况下,算术运算符(在反引号中)就像算术函数一样。

算术运算符:

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

算术函数:

> sum(4, 5)
[1] 9

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

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

是否存在算术运算符优于算术函数的情况?

【问题讨论】:

我不明白这个问题。一元 + 运算符(与二元运算符不同)的行为与记录中的一样。为什么你希望它表现得像sum @Roland,如果 + 在这种情况下是一元运算符,则它只需要一个操作数,小于求和。 【参考方案1】:

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

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

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

请注意,它确实使其所有返回值都为正值,如其中一个 cmets 中所述。

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

> `+`(-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 的结果感到非常失望,因为 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 优先级规则。 (一元算术运算符的优先级高于二元算术运算符。函数和括号隐含地具有最高优先级。我见过由于用户定义函数的优先级较高而出现意外的情况。)

【讨论】:

以上是关于算术运算符是不是比算术函数更可取?的主要内容,如果未能解决你的问题,请参考以下文章

类型转换,算术运算符及其练习题

如何将金额类型更改为数字类型以在javascript中执行算术运算

PyTorch CUDA 与 Numpy 的算术运算?最快的?

算术和逻辑运算指令

int 的基本算术运算 - Java

C语言中啥是算术运算