2016-01-13 22 views
1
counts <- c(18,17,15,20,10,20,25,13,12) 
outcome <- gl(3,1,9) 
treatment <- gl(3,3) 

model1 <- glm(counts ~ outcome + treatment, family = poisson()) 
model2 <- glm(counts ~ outcome, family = poisson()) 

print_params <- function(model){ 
    cat("\nAIC:", model$aic, 
     "\nDeviance:", model$deviance)} 

list_models <- list(model1,model2) 
do.call("rbind", sapply(list_models, print_params, simplify = FALSE)) 

這給了我:當我嘗試用貓進行打印,它給我回NULL的盡頭

AIC: 56.76132 
Deviance: 5.129141 
AIC: 52.76132 
Deviance: 5.129141NULL 

我不知道爲什麼我得到這個。有沒有另外一種方法呢?

+2

'print_params'回報'NULL':什麼是'的的rbind'它的結果呢? – nicola

回答

1

NULL來自命令行,評估你輸入的內容。這link談到它(Spacedman的迴應)。

他們建議你用invisible()包裝函數。這個工作對我來說:

invisible(do.call("rbind", sapply(list_models, print_params, simplify = FALSE))) 

AIC: 56.76132 
Deviance: 5.129141 

AIC: 52.76132 
Deviance: 5.129141 
3

print_params回報NULLcat是副作用),所以如果你看看你*apply的結果,你有cat結果,那麼兩個NULL名單。 do.call然後返回您的函數的結果,然後返回兩個NULL的結果,即一個NULL

爲了捕捉只是副作用,稍有簡化你的語法:

do.call("cat", lapply(list_models, print_params)) 

AIC: 56.76132 
Deviance: 5.129141 
AIC: 52.76132 
Deviance: 5.129141 
+0

另外,如果你將'print_params'中的'cat'改爲'paste','lapply'的結果會更有意義,因爲它會列出一些東西。儘管如此,你仍然需要'cat'來打印'\ n'字符,即'do.call'與我的答案保持一致;它所做的只是更有意義。 – alistaire

相關問題