运算符语法与优先级:1: length()-1与 1:length()-2的冒号运算符行为
我在看一些旧代码,需要处理一些求和,先在向量上计算一些东西,再把结果求和。
在我的代码里有类似这样的片段:
foo <- c(1, 2, 3, 4, 5)
foo[1:length(foo) - 1]
# output: [1] 1 2 3 4
不过,现在我需要在倒数第二个值处停止,我以为可以这样写:
foo[1:length(foo) - 2]
然而,我得到一个错误:
Error in foo[1:length(foo) - 2] :
only 0's may be mixed with negative subscripts
这可以通过括号很容易地解决(这也是我过去的坏习惯之一,最初没有用括号):
foo[1:(length(foo) - 2)]
# output: [1] 1 2 3
这引发了一些我不确定答案的问题。
- 我在文档中没有看到关于运算符优先级的明显说明;这种行为会让我倾向于认为冒号在减法之前。
- 实际发生的到底是什么?至少就这个例子而言,
length(foo) - 1的输出在技术上是正确的,但我觉得这可能只是巧合……我还不确定到底在哪些方面是对的,并且很想理解原因。
解决方案
它在这里有文档:https://stat.ethz.ch/R-manual/R-devel/library/base/html/Syntax.html
| 优先级 | 运算符 | 描述 |
|---|---|---|
| 1 | :: ::: |
在命名空间中访问变量 |
| 2 | $ @ |
组件/槽提取 |
| 3 | [ [[ |
索引 |
| 4 | ^ |
指数运算(从右向左) |
| 5 | - + |
一元负号和正号 |
| 6 | : |
序列运算符 |
| 7 | %any% \|> |
特殊运算符(包括 %% 和 %/%) |
| 8 | * / |
乘法、除法 |
| 9 | + - |
(二元)加法、减法 |
| 10 | < > <= >= == != |
排序与比较 |
| 11 | ! |
取反 |
| 12 | & && |
与 |
| 13 | \| \|\| |
或 |
| 14 | ~ |
如公式中的用法 |
| 15 | -> ->> |
右向赋值 |
| 16 | <- <<- |
赋值(从右向左) |
| 17 | = |
赋值(从右向左) |
| 18 | ? |
帮助(单目和双目) |
参见第6 行和第9 行;二元运算符 - 的优先级低于 :。因此 1:length(foo) - 1 将被解析为 (1:length(foo)) - 1,即 c(1,2,3,4,5) - 1 -> c(0,1,2,3,4)。在索引时,0 会被静默忽略,这也是它意外地得到看起来正确的结果的原因。如果你想先计算减法,请使用括号:1:(length(foo) - 1)。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。