我有以下示例代码。我有一个有16行的数据帧ts。当我用实际数字进行子集时,它工作正常但是当我用计算数字进行子集时,为什么我的代码表现得很奇怪?
有人可以解释一下我的错误吗?
情况1:
> a
[1] 12
> c
[1] 16
> ts$trend[13:16]
[1] 21.36926 21.48654 21.60383 21.72111
> ts$trend[a+1:c]
[1] 21.36926 21.48654 21.60383 21.72111 NA NA NA NA NA NA NA NA
[13] NA NA NA NA
案例2:
> b
[1] 4
> temp[1: 8]
[1] 1 2 3 4 5 6 7 8
> temp[1: b+b]
[1] 5 6 7 8
答案 0 :(得分:5)
R并不关心你的空间表达方式。根据严格的优先方案评估事物。括号中的内容首先完成。所以:
> 1: b+b
[1] 5 6 7 8
因为加法的优先级低于":"。首先评估1:b
,然后添加b
。所以你得到:
> (1:b)+b
[1] 5 6 7 8
如果您想要替代方案,请将事物括起来:
> 1:(b+b)
[1] 1 2 3 4 5 6 7 8
我建议您将(1+b):b
加上括号,如果这是您想要的 - 括号没有区别,但它们有助于忘记优先规则的任何人的可读性。
答案 1 :(得分:2)
这是运营商优先的情况。使用括号
可以避免这种情况temp[1:(b+b)]
#[1] 1 2 3 4 5 6 7 8
如果我们检查OP代码中的问题
1:b
#[1] 1 2 3 4
(1:b) + b
#[1] 5 6 7 8
因此,运算符优先级通过评估1:b然后添加b。
来实现这在?Syntax
:: :::访问命名空间中的变量 $ @ component / slot 提取[[[索引 ^指数(从右到左) - +一元减号和加号 :序列运算符%任何%特殊运算符(包括%%和%/%) * /乘,除 + - (二进制)加,减 < > < => = ==!=订购和比较 !否定 &安培; &安培;&安培;和 | ||要么 〜就像公式一样 - > - >>向右分配 < - << - 赋值(从右到左) =任务(从右到左)
?帮助(一元和二元)
temp <- 1:10
b <- 4