当我尝试使用cat进行打印时,它最终会让我返回NULL

时间:2016-01-13 23:09:51

标签: r cat side-effects

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))

这给了我:

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

我不确定为什么我会这样做。还有另一种方法吗?

2 个答案:

答案 0 :(得分:3)

print_params返回NULLcat是副作用),因此,如果您查看*apply的结果,则会得到{{1}的结果},然后是两个cat的列表。 NULL然后返回您的函数的结果,然后返回do.call两个rbind的结果,即一个NULL

要捕捉副作用,请稍微简化语法:

NULL

给出

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

答案 1 :(得分:1)

NULL来自命令行,评估您输入的内容。link讨论了它(Spacedman的响应)。

他们建议你用invisible()包装函数。这对我有用:

void increment (int *b)
{
    *b = *b + 1;
}

void f()
{
   static int a = 4;
   increment(&a);
   printf("%d\n", a);
}

int main()
{
   f();
   f(); 
   f();
   return 0;
}