do(ggsave ...)似乎工作但抛出错误

时间:2018-03-05 17:13:03

标签: r ggplot2

可重复示例的数据:

DF <- data.frame(plotName=c(rep("bread",20),rep("cheese",20)),
                 mould=rnorm(40,2))

我使用以下形式的命令生成了一系列图:

PlotsDF <- DF %>% group_by(plotName) %>% 
do(plots=
   ggplot(.,aes(mould)) + 
       geom_histogram(bins=10) + 
       ggtitle(.$plotName)
  )

然后尝试用以下方法保存它们:

PlotsDF %>% do(ggsave(plot = .$plots,
                     filename = paste0("./graphics/prefix_" , .$plotName , ".png")
               ))

这似乎工作正常,文件已保存,但完成后会抛出错误,

返回的追溯是:

Error: Results 1, 2, 3, 4, 5, ... must be data frames, not NULL
15.     stop(cnd)
14.     .abort(text)
13.     glubort(NULL, ..., .envir = parent.frame())
12.     bad("Results {bad} must be data frames, not {first_bad_class}", bad = fmt_comma(which(!data_frame)), first_bad_class = fmt_classes(out[[1]][[which.min(data_frame)]]))
11.     label_output_dataframe(NULL, out, groups(.data))
10.     do.rowwise_df(., ggsave(plot = .$plots, filename = paste0("./graphics/prefix_", .$plotName, ".png"), width = 16, height = 9))
9.  do(., ggsave(plot = .$plots, filename = paste0("./graphics/prefix_", .$plotName, ".png"), width = 16, height = 9))
8.  function_list[[k]](value)
7.  withVisible(function_list[[k]](value))
6.  freduce(value, `_function_list`)
5.  `_fseq`(`_lhs`)
4.  eval(quote(`_fseq`(`_lhs`)), env, env)
3.  eval(quote(`_fseq`(`_lhs`)), env, env)
2.  withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
1.  PlotsDF %>% do(ggsave(plot = .$plots, filename = paste0("./graphics/prefix_", .$plotName, ".png"), width = 16, height = 9))

这会成为一个问题,然后编织笔记本,因为它停止了进程。是什么导致错误以及如何摆脱它?

1 个答案:

答案 0 :(得分:0)

问题由do()期望某事物作为数据框返回,这可以通过将ggsave()的返回值设为值来避免:

PlotsDF %>% do(out=ggsave(plot = .$plots,
                 filename = paste0("./graphics/prefix_" , .$plotName , ".png")
           ))

然后返回一个满是NULL的数据帧,这些数据帧可以被丢弃 - 这是一个hacky解决方案,但它可以工作。