可重复示例的数据:
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))
这会成为一个问题,然后编织笔记本,因为它停止了进程。是什么导致错误以及如何摆脱它?
答案 0 :(得分:0)
问题由do()
期望某事物作为数据框返回,这可以通过将ggsave()
的返回值设为值来避免:
PlotsDF %>% do(out=ggsave(plot = .$plots,
filename = paste0("./graphics/prefix_" , .$plotName , ".png")
))
然后返回一个满是NULL的数据帧,这些数据帧可以被丢弃 - 这是一个hacky解决方案,但它可以工作。