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 ^ y
和 y ^ 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 double在R应该以“舍入到最近,连接到偶数”模式完成,但这确实取决于正确设置的编译器和 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/x
是Inf
或者-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.
也可以看看
Syntax
用于运算符优先级。
%*%
用于矩阵乘法。
相关用法
- R AsIs 禁止对象的解释/转换
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
- R warning 警告信息
- R rapply 递归地将函数应用于列表
- R basename 操作文件路径
- R with 评估数据环境中的表达式
- R formals 访问和操纵形式参数
- R icuSetCollate 按 ICU 设置整理
- R search 给出 R 对象的搜索路径
- R Defunct 将对象标记为已失效
- R gzcon 通过连接(解)压缩 I/O
- R readRenviron 从文件设置环境变量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Arithmetic Operators。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。