我有一個整數序列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