2014-02-13 23 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 
相关问题