我有一个整数序列y < -1:6和一个整数对象f,< -5 现在,如果我申请子集到这个序列[R子集化的整数序列
y[f=5] returns 5
y[f<3] returns numeric(0)
y[f>3] returns 1 2 3 4 5 6
请帮我理解表达评价[]内。
我有一个整数序列y < -1:6和一个整数对象f,< -5 现在,如果我申请子集到这个序列[R子集化的整数序列
y[f=5] returns 5
y[f<3] returns numeric(0)
y[f>3] returns 1 2 3 4 5 6
请帮我理解表达评价[]内。
括号内的三个语句做完全不同的事情:
第一行分配5
到f
,然后用它来子集y
。
第二和第三线比较f
到3
(或者小于或大于),并使用比较结果(在第一种情况下FALSE
,在第二种情况下TRUE
)到子集y
。
现在,使用逻辑值的子集简单地选择y
内的各个给定索引为TRUE
的所有值。由于您只给出了一个逻辑索引,但y
包含六个值,逻辑索引是回收 - 即FALSE
变为rep(FALSE, length(y))
(并且TRUE
相同)。因此各自的结果。
它实际上是稍微比这更复杂,因为分配使用=
函数调用的参数列表中不分配给一个变量,其分配给同一个名字的说法:
test = function (a) a
test(1) # returns 1
test(a = 1) # also returns 1
test(b = 1) # error: unused argument (b = 1)
和子集(y[f]
)仅仅是在R的函数调用它的调用一个函数调用[
,并因此等于
`[`(y, f)
亲自试一试!在[
附近的反引号是必要的,因为通常[
不是有效的函数名称。为了像使用常规函数名一样使用它,R需要在反引号之间放置特殊字符。
那么为什么y[f = 5]
给出错误,因为[]
函数调用没有名为f
的参数?原因是[
是原语而不是普通的R函数调用,并且原语完全忽略参数名称。使用<-
原理不同
分配,它总是分配给在当前范围内一个新的变量,即使它在一个函数调用中使用:
y[f <- 1] # returns the first element of y
f # is now 1, not 5!
而且,第1点意味着你可以在一行中将多个变量分配给相同的值,例如, 'y1 < - y2 < - y3 < - 5' – 2015-01-31 22:13:14
@Konard - 感谢您的回应,我明白了您的观点。 – 2015-01-31 22:26:56
这就是所谓的逻辑索引。
如果f是一个向量,f>3
会生成一个TRUE或FALSE元素的逻辑向量,然后可以用它来索引y。
但在你的情况下,f>3
是一个简单的标量,因此会生成一个逻辑值(TRUE),然后用于通过循环索引到y中,即等于所有TRUE值的索引。
它被称为***逻辑索引***。如果f是一个向量,'f> 3'将生成TRUE或FALSE元素的逻辑向量,然后可以使用它来索引y。但在你的情况下,'f> 3'是一个简单的标量,因此产生一个逻辑值(TRUE),然后用于通过循环索引到y中,即相当于所有TRUE值的索引。 – smci 2015-02-01 04:02:04