括号使向量不同。矢量表达式究竟是如何计算的?

Brackets make a vector different. How exactly is vector expression evaluated?

我有一个数据框如下:

planets               type diameter rotation rings
Mercury Terrestrial planet    0.382    58.64 FALSE 
Venus   Terrestrial planet    0.949  -243.02 FALSE 
Earth   Terrestrial planet    1.000     1.00 FALSE 
Mars    Terrestrial planet    0.532     1.03 FALSE
Jupiter          Gas giant   11.209     0.41 TRUE
Saturn          Gas giant     9.449     0.43 TRUE
Uranus          Gas giant     4.007    -0.72 TRUE
Neptune          Gas giant    3.883     0.67  TRUE

我想 select 最后 3 行:

planets_df[nrow(planets_df)-3:nrow(planets_df),]

然而,我得到了一些我没想到的东西:

planets          type                  diameter rotation rings
Jupiter          Gas giant            11.209     0.41  TRUE
Mars             Terrestrial planet    0.532     1.03 FALSE
Earth            Terrestrial planet    1.000     1.00 FALSE
Venus            Terrestrial planet    0.949  -243.02 FALSE
Mercury          Terrestrial planet    0.382    58.64 FALSE

通过反复试验,我了解到

> (nrow(planets_df)-3):nrow(planets_df)
[1] 5 6 7 8

> nrow(planets_df)-3:nrow(planets_df)
[1] 5 4 3 2 1 0

R究竟是如何计算:语句(参考括号)?

nrow(planets_df)-3:nrow(planets_df) 被评估为 8 - (3:8) 或

(8-3) (8-4) (8-5) (8-6) (8-7) (8-8) = 5 4 3 2 1 0

为了将来参考,如果您需要最后几行,请使用 tail(planets_df, 3)

冒号: 分隔序列的起点和终点。它比 +- 运算符具有更高的优先级。 因此,

nrow(planets_df)-3:nrow(planets_df)

等于

nrow(planets_df) - (3:nrow(planets_df))

如果您希望最后三个条目使用此语法,您需要将定义序列开头的整个表达式放在方括号中:

planets_df[(nrow(planets_df)-3):nrow(planets_df),]

冒号运算符将优先于算术运算。最好通过示例进行实验以内化逻辑:

2*2:6-1

我们应该期待什么答案?有人会说 4 5。想法是它将简化为 2*2=46-1=5,因此 4:5

2*2:6-1
[1]  3  5  7  9 11

这个答案会让任何没有考虑过游戏中操作顺序的人感到惊讶。表达式 2*2:6-1 的简化方式不同。先进行序列2:6,然后是乘法,最后是加法。我们可以把它写成 2 * (2 3 4 5 6),也就是 4 6 8 10 12 然后减去 1 得到 3 5 7 9 11.

通过用括号分组,我们可以控制运算顺序,就像我们在基本算术中类似地做的那样,以获得我们最初预期的答案。

(2*2):(6-1)
[1] 4 5

您可以将此推理应用于您的示例,以调查 : 运算符看似奇怪的行为。

现在你知道了密码,我们应该从 (2*2):6-1 得到什么?