2014-02-13 3 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 

그러나 내가 list에서 x1x2 데이터 프레임을 가지고 있다고 가정합니다. 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)으로 변환 할 수 있습니까?

+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