运算符语法与优先级:1: length()-1与 1:length()-2的冒号运算符行为

前端开发 2026-07-09

我在看一些旧代码,需要处理一些求和,先在向量上计算一些东西,再把结果求和。

在我的代码里有类似这样的片段:

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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章