一個簡單的比喻就是把列表看作一列火車。火車上的每輛車都帶着東西。如果您取下兩輛車,則會有一輛車少兩輛車。如果你除去一輛車,它仍然是一輛單車的火車。
- 通過
[]
(子集)函數可以實現減小列車大小或重組汽車的順序。
- 要檢查特定汽車的內容,必須打開大門,這通過0(儘管
$
也可能與命名列表一起使用)來實現。我把這稱爲提取函數,但我不確定這是一個廣泛使用的術語。
在您的示例中,mylist [2]是包含一個元素的mylist子列表。您可以使用length(mylist[2])
進行驗證。假設參數有效,[
函數將提供一個列表,其中包含的數字或字符向量中包含的元素的數量與[
的參數一樣多。大多數情況下,我們有興趣檢查列表項目的內容。這是通過[[
函數實現的。例如,mylist[[2]]
是mylist[2]
的內容,其本身是包含多個元素的列表。看到這一點,嘗試length(mylist[[2]])
因爲[
可以被認爲是作爲一個列表子集功能和[[
作爲列表元素提取功能,mylist[1:2]
和mylist[c(1,2)]
返回一個子列表(其等同於MYLIST在這種情況下),而mylist[[1:2]]
和mylist[[c(1,2)]]
返回「下標越界」錯誤。一次只能提取一個列表元素(即每個函數調用)。
@ richard-scriven提醒我注意Hadley Wickham twitter post上的鏈接,以照片的形式提供了一個嵌套列表的附加類比。
使用相當簡單的列表結構,str
是瞭解列表內容的好方法。在本例中,str(mylist[2])
和str(mylist[[2]])
的輸出提供了有關其不同數據結構的其他信息。
通常,列表與其內容不可知,因此單個列表可能包含其他列表,數據框架,矩陣和原子矢量作爲單獨的元素。作爲@joran,在他的評論中開玩笑說,這個火車比喻被拉長的地方,可能有點太多了。但是,一旦您熟悉列表的第一級,其他嵌套列表的行爲將以相同的方式進行。 (也許是嵌套列表被箱中攜帶的列車車廂內?)
旁註:
我最喜歡的功能檢查列表和data.frames(這是一個共同的長度的原子向量名單) ,是str
函數。在閱讀.csv,.dta或其他文件後,我會定期使用它來檢查列表結構。用戶在調試代碼時學習R(以及有經驗的用戶)的一個常見障礙是記住他們正在使用哪種數據結構,以及需要哪種數據結構作爲函數輸出的參數或數據結構。 str
連同typeof
和class
,是解決此問題的優秀套件。
此答案受益於@ 42,@nicola,@joran,@jogo和@ richard-scriven的評論。
來源
2016-04-23 19:26:05
lmo
mylist [2]'是mylist的子列表。這將是一個列表,其中包含數量爲「[」的數字或字符參數中的元素。 'mylist [[2]]'是mylist [2]'的內容。 「[[」函數只需要返回一個元素,儘管在這種情況下它是一個包含多個元素的列表。它可以是另一個列表(如在這種情況下)或者也可以是一個矩陣或一個未經調整的原子向量。 –
mylist [2]'返回一個包含一個元素的列表(在你的例子中是一個列表)。所以你最終得到一個包含三個「字符」向量列表的列表。 'mylist [[2]]'取mylist'的第二個元素,它是一個包含三個'character'向量的列表。試試'length(mylist [2])'和'length(mylist [[2]])'。另請參閱'str(mylist [2])'和'str(mylist [[2]])'的輸出。 – nicola
我聽說的一個比喻是把列表看作一列火車。火車上的每輛車都帶着東西。如果您取下兩輛車,則會有一輛車少兩輛車。如果你除去一輛車,它仍然是一列火車。這相當於'[]'。要查看特定汽車所持有的東西,必須打開門,相當於'[[]]''。 – lmo