括号使向量不同。矢量表达式究竟是如何计算的?
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=4
和 6-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
得到什么?
我有一个数据框如下:
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=4
和 6-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
得到什么?