2014-05-02 39 views
2

我的問題源於在用戶創建的函數中使用[[]]來引用列表元素。據我所知,當應用於矢量時,[[]]的工作方式與[]的工作方式相同。R列出了廣義矢量嗎?

雖然所有其他列表操作都是如此嗎?作爲另一個例子,我可以在矢量上使用lapply。

如果列表僅僅是一個廣義矢量,其條目可以是不同的模式,那麼這是合理的。

+0

你所引用的答案在解釋'[]'和'[[]]'之間的區別很好,但它並沒有告訴我任何關於列表和向量之間的意識形態關係。另外,你引用的問題的標題在所有載體中都沒有提及。 – Alex

+0

也許我的問題更好的措辭是「可以爲列表寫入的任何函數接受向量嗎?」 – Alex

+0

啊,我明白你現在問的是什麼,這實際上是個好問題。 –

回答

1

因爲我沒能拿出更多的反例,我提到的文件R上的內部,它似乎你的直覺是正確的。

如果看一下R上的數據結構的C中的底層結構的部分, SEXPTYPEs,列表被隱含爲通用載體:

19 VECSXP列表(通用矢量)

2

編輯:一行半的答案是,列表和原子向量都是矢量類型,子集的方式完全一樣。

這個答案擴展了列表和原子向量之間的區別。

的r數據結構的最好的解釋,具體名單和原子之間的載體,是(在我看來)哈德利韋翰的新書: http://adv-r.had.co.nz/Data-structures.html

兩個列表和原子向量是一維的數據結構。但是,原子向量是均勻的,列表是異構的。列表可以包含任何類型的向量,包括其他列表。另一方面,原子載體是平坦的。

至於使用[] VS [[]],子集[]被保持爲兩個列表和原子矢量,其中作爲[[]]被簡化。因此,[][[]]是不相同的,不管是應用於列表還是原子向量。例如,[[]]將通過刪除名稱來簡化命名向量;通過[]子集名稱向量將保持名稱。對於列表,[[]]將拉出列表的內容,並可以返回一些簡化的數據結構。通過[]對列表進行子集將始終返回列表(保留)。

通過[[]]對原子向量進行子集將返回一個長度爲一個原子向量。通過[[]]對列表進行子集可以返回許多不同類別的數據結構。這可以追溯到原子向量是同質的並且列表是異構的這一事實。但是,根據哈德利,子集列表工作完全相同的方式與子集的原子矢量。

看看哈德利的書作進一步參考本節: http://adv-r.had.co.nz/Subsetting.html#subsetting-operators

+0

我不同意剝離名稱:'[['和'['對列表和向量都做同樣的事情。 '[[''在列表中也會去掉那個元素的名字(如果這個列表被命名)。 –

+0

你是對的 - 我的觀點是''''''''[[]]'是不同的。該操作指出,「[[和]]在應用於矢量時的工作方式與[和]相同。」 –

+0

無論如何,哈德利真的有一個徹底的討論。我幾乎想要發佈一個鏈接到他的書,並給他信貸。 –