2013-05-19 1 views
3

의 내가 목록에 저장된 일부 모델 있다고 가정 해 봅시다 :목록의 모든 요소를 ​​이름없는 인수로 함수에 전달하려면 어떻게해야합니까?

mods <- list() 
mods[[1]] <- lm(mpg ~ disp, data = mtcars) 
mods[[2]] <- lm(mpg ~ disp + factor(cyl), data = mtcars) 
mods[[3]] <- lm(mpg ~ disp * factor(cyl), data = mtcars) 

그리고 stats::AIC를 사용하여 비교하려는. AIC(mods[[1]], mods[[2]], mods[[3]])에서 얻을 수있는 결과물을 찾고 있지만 임의로 긴 목록으로 일반화하고 싶습니다. 그 생각은

do.call(AIC, mods) 

입니다. 그러나 매우 장황하고 도움이되지 않습니다. (목록의 이름은 경우, 이름 중 하나는 AIC의 첫 번째 인수를 해당 object되지 않는 오류가 발생하지만 다음 방금 다시 자세한 출력을 얻을.)

do.call의 실패 후, 나는 생각하기 시작 eval(parse()) 해결책에 관하여, 그러나 나는 나가 여기에서 첫째로 사문해야 한 ㄴ다는 것을 생각했다.

+2

단순히 rownames를 제거 할 수 없습니까? ('test = do.call (AIC, mods); rownames (test) = NULL'과 같이) – baptiste

답변

4
summary(do.call(AIC, mods)) 
     df   AIC  
Min. :3 Min. :153.4 
1st Qu.:4 1st Qu.:159.6 
Median :5 Median :165.8 
Mean :5 Mean :163.1 
3rd Qu.:6 3rd Qu.:168.0 
Max. :7 Max. :170.2 

하지만 이것은 원하는 바가 아닙니다. 이것은 오히려 가까운

my.aic <- function(x) { 
    x <- do.call(AIC, x) 
    rownames(x) <- NULL 
    return(x) 
} 
my.aic(mods) 
## df  AIC 
## 1 3 170.2094 
## 2 5 165.7680 
## 3 7 153.4352 

:

AIC(mods[[1]], mods[[2]], mods[[3]]) 
##   df  AIC 
## mods[[1]] 3 170.2094 
## mods[[2]] 5 165.7680 
## mods[[3]] 7 153.4352 
+0

이것을 조금 사용한 후에, 나는 그것이 실망스럽게 느려질 수 있다고 말할 것이다. 기본적으로 넣은 rownames는 거대 할 수 있으며, 제거하기 만하면 느려집니다. 이 답변이 "올바른"방법 인 것처럼 보이지만, 해답 인 eval (구문 분석) 솔루션으로 되돌아갔습니다. – Gregor

1

여기 eval(parse())를 사용하여 솔루션의 티스트는 답이 있습니다. 다행히도 Matthew는 입력을하기 전에 더 나은 답변을주었습니다.

AIC_l <- function(L, FUN = "AIC") { 
    args <- paste0("mods[[", seq_along(L), "]]", collapse = ", ") 
    my_call <- paste0(FUN, "(", args, ")") 
    eval(parse(text = my_call)) 
}