r - 算术运算符是否比算术函数更可取?

标签 r function operators

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

算术运算符:

> `+`(4, 5)
[1] 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

请注意,它并没有像评论之一中所说的那样使所有返回的值都为正值。

下一步:二进制 '+` 运算符:
> `+`(-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 优先级规则。 (一元算术运算符的优先级高于二元算术运算符。函数和括号隐式具有最高优先级。我见过由于用户定义函数的优先级更高而出现意外的情况。)

关于r - 算术运算符是否比算术函数更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363480/

相关文章:

r - data.table:通过引用聚合、连接和分配

c++ - 在命名空间中调用函数

JavaScript 函数没有将我的参数传递给其他函数

c# - 相等和赋值运算符

r - 如何在 R 中可视化大型网络?

r - 基于两列字符串匹配的子集 R 数据框

r - 拼凑不会减少两个 ggplot2 之间的空白

php - 将参数数组与单个参数传递给 PHP 中的函数?

c - 小于 (<) 运算符如何与 c 中的混合类型一起使用

C++ + 运算符的这种用法叫什么?目的是什么?