2016-04-21 81 views
7

瞭解以下mylist[2]mylist[[2]]之間的區別的底層邏輯或哲學基礎是什麼?有沒有一種合乎邏輯的方式來思考列表索引?

什麼是理解單個方括號與雙方括號的簡單邏輯方法?

> mylist <- list(1, list("a","b","c")) 

> mylist[2] 
# [[1]] 
# [[1]][[1]] 
# [1] "a" 

# [[1]][[2]] 
# [1] "b" 

# [[1]][[3]] 
# [1] "c" 

> mylist[[2]] 
# [[1]] 
# [1] "a" 

# [[2]] 
# [1] "b" 

# [[3]] 
# [1] "c" 
+3

mylist [2]'是mylist的子列表。這將是一個列表,其中包含數量爲「[」的數字或字符參數中的元素。 'mylist [[2]]'是mylist [2]'的內容。 「[[」函數只需要返回一個元素,儘管在這種情況下它是一個包含多個元素的列表。它可以是另一個列表(如在這種情況下)或者也可以是一個矩陣或一個未經調整的原子向量。 –

+2

mylist [2]'返回一個包含一個元素的列表(在你的例子中是一個列表)。所以你最終得到一個包含三個「字符」向量列表的列表。 'mylist [[2]]'取mylist'的第二個元素,它是一個包含三個'character'向量的列表。試試'length(mylist [2])'和'length(mylist [[2]])'。另請參閱'str(mylist [2])'和'str(mylist [[2]])'的輸出。 – nicola

+3

我聽說的一個比喻是把列表看作一列火車。火車上的每輛車都帶着東西。如果您取下兩輛車,則會有一輛車少兩輛車。如果你除去一輛車,它仍然是一列火車。這相當於'[]'。要查看特定汽車所持有的東西,必須打開門,相當於'[[]]''。 – lmo

回答

7

一個簡單的比喻就是把列表看作一列火車。火車上的每輛車都帶着東西。如果您取下兩輛車,則會有一輛車少兩輛車。如果你除去一輛車,它仍然是一輛單車的火車。

  • 通過[](子集)函數可以實現減小列車大小或重組汽車的順序。
  • 要檢查特定汽車的內容,必須打開大門,這通過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連同typeofclass,是解決此問題的優秀套件。

此答案受益於@ 42,@nicola,@joran,@jogo和@ richard-scriven的評論。

+2

之間的差距也可以指向他們以獲得一些很好的可視化https:// twitter .com/hadleywickham/status/643381054758363136,雖然我不會把辣椒包裝在胡椒瓶裏面。哈哈 –

相關問題