Как использовать объект «список», когда требуется аргумент?

Во многих функциях 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 и x2 в файле list. Как я могу использовать этот list с аргументом ... в rbind?

Я уже пробовал следующее, но безуспешно:

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

В каждом из этих случаев результат НЕ такой, как из rbind(x1, x2). Что мне не хватает?

ОБНОВЛЕНИЕ 1:
Как указано в ответах, do.call(rbind, list(x1, x2)) в этом случае отлично работает. Однако мне интересно, можно ли избежать do.call техники. Другими словами, можно ли преобразовать list(x1, x2) так, чтобы ... его правильно понял?


person landroni    schedule 13.02.2014    source источник
comment
Почти дубликат: stackoverflow.com/q/6192138/324364   -  person joran    schedule 13.02.2014
comment
do.call — потрясающая функция, и я уверен, что вы задели ее чувства, когда сказали, что хотите избежать ее без уважительной причины. Я также не понимаю, почему вы думаете, что rbind(list) сработает. Как вы сказали, rbind берет несколько объектов в .... список является одним объектом.   -  person rawr    schedule 13.02.2014
comment
@rawr Никаких обид не было. :) Что касается list, то это набор из нескольких объектов. Я надеялся, что трюк, подобный unlist(list), автоматически передаст несколько внедренных объектов в rbind().   -  person landroni    schedule 14.02.2014


Ответы (2)


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
person Jake Burkhead    schedule 13.02.2014
comment
Это работает отлично. Но мне интересно, можно ли избежать do.call техники? - person landroni; 13.02.2014
comment
@landroni Почему ты хочешь этого избежать? - person Konrad Rudolph; 13.02.2014
comment
Думаю, зря. Мне было интересно, можно ли это сделать. - person landroni; 13.02.2014

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
person BrodieG    schedule 13.02.2014