当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R Arithmetic 算术运算符


R语言 Arithmetic 位于 base 包(package)。

说明

这些一元和二元运算符对数字或复数向量(或可以强制转换为它们的对象)执行算术运算。

用法

+ x
- x
x + y
x - y
x * y
x / y
x ^ y
x %% y
x %/% y

参数

x , y

数字或复数向量或可以强制转换为此类的对象,或已为其编写方法的其他对象。

细节

一元和二元算术运算符是通用函数:可以单独为它们编写方法,也可以通过 Ops 组通用函数编写方法。 (有关如何计算调度的信息,请参阅Ops。)

如果应用于数组,如果这是合理的,结果将是一个数组(例如,如果已调用回收规则,则结果将不是一个数组)。

逻辑向量将被强制为整数或数值向量,FALSE 的值为 0,TRUE 的值为 1。

1 ^ yy ^ 0 始终是 1 。当任一(数字)参数为 infinite ( Inf-Inf 之一)时,x ^ y 也应该给出正确的限制结果。

诸如数组或时间序列之类的对象可以通过这种方式进行操作,只要它们是一致的。

对于双参数,如果 x 远大于 y ,则 %% 可能会遭受灾难性的准确性损失,如果检测到这种情况,则会发出警告。

%%x %/% y 可用于非整数 y ,例如1 %/% 0.2 ,但结果可能会出现表示错误,因此可能与平台相关。由于 0.2 的 IEC 60559 表示形式是比 0.2 稍大的二进制分数,因此 1 %/% 0.2 的答案应该是 4,但大多数平台给出 5

用户有时会对返回的值感到惊讶,例如为什么(-8)^(1/3)NaN。为了base double输入,R在所有平台上使用 IEC 60559 算法,以及 C 系统函数‘⁠战俘⁠' 为了^操作符。相关标准定义了许多极端情况下的结果。特别是,上例中的结果是由 C99 标准强制执行的。在许多类 Unix 系统上,该命令man pow给出了大量极端情况下的值的详细信息。

类型算术base doubleR应该以“舍入到最近,连接到偶数”模式完成,但这确实取决于正确设置的编译器和 FPU。

一元 + 和一元 - 返回数字或复数向量。如果没有强制转换,所有属性(包括类)都会被保留:逻辑 x 被强制转换为整数,并且名称、暗淡和暗淡名称会被保留。

二元运算符返回包含逐个元素运算结果的向量。如果涉及零长度向量,则结果的长度为零。否则,较短向量的元素将根据需要进行回收(当它们仅部分回收时,使用warning)。这些运算符包括+(用于加法)、-(用于减法)、*(用于乘法)、/(用于除法)和^(用于求幂)。

%%表示x mod y(“x modulo y”),即计算‘remainder’r <- x %% y, 和%/%表示整数除法,其中R使用“floored”整数除法,即q <- x %/% y := floor(x/y),如 Donald Knuth 所推广,请参阅维基百科页面上的“模运算”,因此sign(r) == sign(y)。可以保证

x == (x %% y) + y * (x %/% y)

(直至舍入误差)

除非y == 0,其中%%的结果是NA_integer_NaN(取决于参数的typeof),或者对于某些非finite参数,例如,当上述恒等式的RHS等于到Inf - Inf

如果任一参数为复数,则结果将为复数,否则如果一个或两个参数为数字,则结果将为数字。如果两个参数的类型均为 integer ,则 /^ 的结果类型为 numeric,对于其他运算符,其结果类型为整数(在 处发生溢出,返回为 NA_integer_ 带有警告)。

确定结果属性的规则相当复杂。大多数属性都取自较长的参数。如果名称与答案的长度相同,则将从第一个名称复制,否则从第二个名称复制。如果参数长度相同,则将从两个参数复制属性,当两个参数中存在相同属性时,第一个参数的属性优先。对于时间序列,仅当系列兼容且使用时间序列的类和 tsp 属性(如果两者都相同时,则相同)时,才允许执行这些操作。对于数组(和数组结果),如果它是数组,则从第一个参数获取维度和暗名称,否则从第二个参数获取。

S4方法

这些运算符是 S4 Arith 组泛型的成员,因此可以为它们单独编写方法,也可以为组泛型(或 Ops 组泛型)编写方法,参数为 c(e1, e2)(缺少 e2)对于一元运算符)。

实施限制

R依赖于操作系统服务(以及它们的 FPU)进行浮点运算。在所有当前R平台使用 IEC 60559(也称为 IEEE 754)算法,但这些标准中的某些内容是可选的。特别是,对以下方面的支持:非正规的又名低于正常的数字(超出给定范围的数字.Machine)在平台之间甚至在单个平台上的计算之间可能会有所不同。

另一个潜在问题是带符号的零:在 IEC 60559 平台上有两个零,其内部表示形式因符号而异。在可能的情况R将它们视为相同,但例如 C 代码的直接输出通常不会这样做,并且可能输出‘⁠-0.0⁠”(在 Windows 上是否这样做取决于 Windows 版本)。一个地方在R可以看出差异在于除以零:1/xInf或者-Inf取决于零的符号x。另一个地方是identical(0, -0, num.eq = FALSE).

注意

所有涉及零长度向量的逻辑运算都具有零长度结果。

二元运算符有时被称为函数,例如`&`(x, y) :请参阅Ops 中如何完成argument-matching 的说明。

**在解析器中被翻译为^,但这多年来一直没有记录。它在 Becker 中显示为索引条目等人(1988),指出帮助Deprecated但该页面实际上并未提及。尽管它在 S 中已被弃用了 20 年,但在R在2008。

例子

x <- -1:12
x + 1
2 * x + 3
x %%  3 # is periodic  2 0  1  2 0  1 ...
x %% -3 #  (ditto)    -1 0 -2 -1 0 -2 ...
x %/% 5
x %% Inf # now is defined by limit (gave NaN in earlier versions of R)

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

D. Goldberg (1991). What Every Computer Scientist Should Know about Floating-Point Arithmetic. ACM Computing Surveys, 23(1), 5-48. doi:10.1145/103162.103163.
Also available at https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html.

For the IEC 60559 (aka IEEE 754) standard: https://www.iso.org/standard/57469.html and https://en.wikipedia.org/wiki/IEEE_754.

On the integer division and remainder (modulo) computations, %% and %/%: https://en.wikipedia.org/wiki/Modulo_operation, and Donald Knuth (1972) The Art of Computer Programming, Vol.1.

也可以看看

sqrt 用于杂项,Special 用于特殊数学函数。

Syntax 用于运算符优先级。

%*% 用于矩阵乘法。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Arithmetic Operators。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。