如果需要'...'参数,如何使用'list'对象?

时间:2014-02-13 18:10:43

标签: r list arguments ellipsis variadic-functions

在许多R函数中,...参数用于提供多个对象。如何在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

但假设我在x1中有x2list个数据框。如何将list...中的rbind参数一起使用?

我已经尝试过以下操作,但没有成功:

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)以便...正确理解它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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