2015-09-14 35 views
0

我不知道我明白在這兩個場景中的不同的輸出:ř編程 - 使用lapply和一個簡單的功能之間的差異

(1)

pioneers <- c("GAUSS:1777", "BAYES:1702", "PASCAL:1623", "PEARSON:1857") 
split <- strsplit(pioneers, split = ":") 
split 

(2)

pioneers <- c("GAUSS:1777", "BAYES:1702", "PASCAL:1623", "PEARSON:1857") 
split <- lapply(pioneers, strsplit, split = ":") 
split 

在這兩種情況下,輸出是一個列表,但我不知道什麼時候我會用一個符號(簡單地適用於載體的功能)或其他(使用LAPP通過向量循環函數)。

感謝您的幫助。

Greg

+0

我認爲這部分取決於你想應用的功能。如果它可以處理矢量,你可以做'myfun(myvector)'。如果沒有,你可以使用lapply。 – Heroka

+0

在這種特殊情況下,我不確定什麼時候需要做後者(它會創建一個更復雜的與IMO合作的結構)。 「strsplit」的結果通常是'lapply'。另外,R有一個'split'函數(像''lapsly''這樣的'strsplit')。另外,儘管區分使用'split'作爲變量名稱還是內置函數是非常聰明的,但對命名空間的跺腳可能會使調試問題變得很困難(例如,當您意外地將「split」分配給某個事物,但意味着將呼叫的輸出分配給「split」)。 – hrbrmstr

+0

'strsplit'是一個矢量化函數,即它可以在整個矢量上工作,對每個元素應用分割,所以這裏不需要'lappply'。如果要修改/擴展結果列表的某些內容,例如提取每個列表元素的第二個元素,可以使用'lapply'(split,「[」,2) '(其中'split'是'strsplit(pioneers,split =「:」)''的結果。 –

回答

2

對我來說這是關於輸出如何返回。 [l]apply表示應用列表 - 即輸出作爲列表返回。 strsplit已經返回一個列表,如果您的pioneers向量中有多個: s,則它是唯一有意義的數據結構 - 即向量的4個元素中的每個元素的列表元素,並且每個列表元素都包含分割的向量串。

因此,使用lapply(x, strsplit, ...)將始終返回列表中的列表,在這種情況下您可能不想要列表。

使用lapply在您希望您應用的函數的結果是未定義或可變長度的向量的情況下非常有用。由於strsplit已經可以看到這一點,所以lapply的使用是多餘的,因此您應該可能知道您期望/想要您的答案的形式,並使用適當的函數將輸出強制轉換爲正確的數據結構。

爲了說清楚,你給出的例子的輸出是不一樣的。一個是列表,一個是列表。相同的結果將是

lapply(pioneers, function(x, split) strsplit(x, split)[[1]], split = ":")

即服用內部列表的第一列表元素(其僅僅是1無論如何元件)在每種情況下。

+0

謝謝 - 這對我有很大的幫助。 – drgregmartin