2014-02-13 51 views
0

在許多R函數中,參數...用於提供多個對象。如何在...參數中提供list對象?當需要'...'參數時如何使用'list'對象?

例如:

x1 <- head(iris) 
x2 <- tail(iris) 
rbind(x1, x2) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
#1   5.1   3.5   1.4   0.2 setosa 
#2   4.9   3.0   1.4   0.2 setosa 
#3   4.7   3.2   1.3   0.2 setosa 
#4   4.6   3.1   1.5   0.2 setosa 
#5   5.0   3.6   1.4   0.2 setosa 
#6   5.4   3.9   1.7   0.4 setosa 
#145   6.7   3.3   5.7   2.5 virginica 
#146   6.7   3.0   5.2   2.3 virginica 
#147   6.3   2.5   5.0   1.9 virginica 
#148   6.5   3.0   5.2   2.0 virginica 
#149   6.2   3.4   5.4   2.3 virginica 
#150   5.9   3.0   5.1   1.8 virginica 

但是假設我有一個listx1x2數據幀。我如何在rbind中使用list...參數?

我已經試過以下,但沒有成功:

rbind(list(x1, x2)) 
rbind(substitute(list(x1, x2))[-1]) 
rbind(unlist(list(x1, x2))) 

在每種情況下,結果並不如從rbind(x1, x2)。我錯過了什麼?

UPDATE1
作爲答案建議,do.call(rbind, list(x1, x2))似乎在這種情況下正常工作。但是,我想知道是否可以避免do.call機器。換句話說,是否有可能將list(x1, x2)轉換成...正確理解它?

+1

幾乎重複:http://stackoverflow.com/q/6192138/324364 – joran

+0

' do.call'是一個神話般的功能,當你說你想避免它沒有很好的理由時,我相信你傷害了它的感覺。我也不明白你爲什麼認爲'rbind(list)'會起作用。正如你所說,'rbind'在'...'中有幾個對象。列表是單個對象。 – rawr

+0

@rawr沒有任何意圖。 :)至於'list',它是幾個對象的集合。我希望類似'unlist(list)'的技巧能夠自動將幾個嵌入對象傳遞給'rbind()'。 – landroni

回答

3

do.call是你在這種情況下使用的。

df1 <- head(iris) 
df2 <- tail(iris) 
l <- list(df1, df2) 

do.call(rbind, l) 
##  Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
## 1   5.1   3.5   1.4   0.2 setosa 
## 2   4.9   3.0   1.4   0.2 setosa 
## 3   4.7   3.2   1.3   0.2 setosa 
## 4   4.6   3.1   1.5   0.2 setosa 
## 5   5.0   3.6   1.4   0.2 setosa 
## 6   5.4   3.9   1.7   0.4 setosa 
## 145   6.7   3.3   5.7   2.5 virginica 
## 146   6.7   3.0   5.2   2.3 virginica 
## 147   6.3   2.5   5.0   1.9 virginica 
## 148   6.5   3.0   5.2   2.0 virginica 
## 149   6.2   3.4   5.4   2.3 virginica 
## 150   5.9   3.0   5.1   1.8 virginica 
+0

這完美的作品。但是我想知道是否有可能避免'do.call'機器? – landroni

+1

@landroni你爲什麼要避免它? –

+0

因爲沒有好處,所以我想。我想知道這是否可以完成。 – landroni

1

plyr有一個函數將其他函數轉換爲接受列表作爲參數的形式。它基本上只是一個包裝do.call,但如果這是你做了很多,你可以定義自己的自定義功能:

library(plyr) 
rbindl <- splat(rbind) 
lst <- list(head(iris, 3), tail(iris, 3)) 
rbindl(lst) 
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
# 148   6.5   3.0   5.2   2.0 virginica 
# 149   6.2   3.4   5.4   2.3 virginica 
# 150   5.9   3.0   5.1   1.8 virginica 
相關問題