2016-08-10 82 views
1

舉例來說,如果我有一個多維列表對象,比如說,「X」在R中,爲什麼使用do.call更改結果?

x <- list(); x[[1]] <- c(1,2,3); x[[2]] <- c(2,3,4); 
x[[3]] <- c(3,4,5); x[[4]] <- c(4,5,6) 
a <- combn(x,3) 

如果我想每一行的第一列合併成一個單一的載體,這不給我我想要的:

c(a[1:3,1]). 

它返回一個列表,每個元素包含原始列表的一個元素。取而代之的是,這個工程:

do.call(c,a[1:3,1]) 

按照幫助說明,所有do.call確實是執行函數,那麼,爲什麼結果不同?

回答

3

c(a[1:3,1])這裏相當於a[1:3,1]這相當於a[1:3]。所有這些都是把這個列表結合起來,而不是把這個列表的元素結合起來。

do.call對參數列表執行函數調用,在這種情況下,它執行c函數來組合a的元素。

你想要的是c(a[1:3], recursive = TRUE),它通過列表遞歸地將元素組合到一個單獨的向量中。

+0

你確定[1:3,1] = a [1:3]?我嘗試了[1:3,2],這是不同的。 – Bob

+0

是的,這只是你在這種情況下定義'a'的一個神器,這對解決方案沒有多大意義,所以你不會想知道爲什麼我在後面保存了三個句子。當你返回一個列表時,很容易看到它是如何工作的,即'a < - combn(x,3,simplify = FALSE) – shayaa

3

do.call的第二個參數是傳遞給函數的參數列表。所以do.call(c, a[1:3,1])相當於c(a[[1]], a[[2]], a[[3]])

如果要在使用do.call時將列表傳遞給c,則需要將列表放在列表中:do.call(c, list(a[1:3,1]))

相關問題