2014-02-13 4 views
0

Во многих 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). Что мне не хватает?

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 
Смежные вопросы