ggplot导出可编辑PPT报错:inherits(value$ggobj,"ggplot") is not TRUE 求助
问题描述
我有自有数据,想要绘制以Year为X轴、平均时长(天数)为Y轴的柱状图,再将该图导出为可编辑的pptx幻灯片。调整代码后R抛出如下错误:
Error in ph_with.dml(
*tmp*, value = p_dml, ph_location()) :
inherits(value$ggobj, "ggplot") is not TRUE
注:在MacBook上使用R Markdown,相关代码如下:
library(tidyverse) library(dplyr) library(ggplot2) library(officer) library(rvg) library(mschart) library(here) library(glue) library(viridis) library(purrr) Project_stages <- read_excel( "/Users/giang/Library/CloudStorage/OneDrive-GCF/Documents/R/Test w R/Project stages 131122.xlsx") Project_stages_1 <- Project_stages%>% filter(Stage %in% c("00. PI received", "01. Stage 3: CN received", "04. Stage 4: FP received", "14. Stage 6: Approved")) %>% spread(key = Stage, value = 'Day of Stage Date') %>% select(`Approved Ref`,Index,PI =`00. PI received`, CN=`01. Stage 3: CN received`, FP=`04. Stage 4: FP received`, Approved='14. Stage 6: Approved') %>% mutate(Project_received= as.Date((ifelse(!is.na(PI), as.character(PI), ifelse(!is.na(CN), as.character(CN), ifelse(!is.na(FP), as.character(FP), "")))), format="%Y-%m-%d")) %>% filter(Index==1) %>% mutate(duration= as.numeric(difftime(Approved,Project_received, units = "days")), Sub_Year= as.numeric(format(Project_received, format= "%Y"))) p <- Project_stages_1 %>% select(duration, Sub_Year) %>% group_by(Sub_Year) %>% summarise(Avrg= round(mean(duration)), Mdn= round(median(duration))) ggplot(p, aes(x= Sub_Year, y= Avrg)) + geom_bar(stat = "identity", fill="#a13458") + theme_minimal() + ggtitle("Duration of project submission to GCF") p p_dml <-dml(ggobj = p) %>% read_pptx() %>% add_slide("Title and Content", "Office Theme") %>% ph_with(p_dml, ph_location()) %>% print(target = here("results2.pptx"))
错误原因与修复方案
问题根源
- 变量
p是数据框而非ggplot对象:你把汇总后的统计数据存到了p里,而ggplot()生成的图表没有赋值给任何变量,导致dml(ggobj = p)传入的是数据框,不符合函数要求,触发报错。 - 管道顺序逻辑错误:你把
dml()的结果直接和read_pptx()用管道连接,正确顺序应该是先初始化pptx文件,再添加幻灯片,最后插入图表。
修复后的完整代码
library(tidyverse) library(dplyr) library(ggplot2) library(officer) library(rvg) library(mschart) library(here) library(glue) library(viridis) library(purrr) library(readxl) # 补充read_excel依赖包,避免未加载报错 Project_stages <- read_excel( "/Users/giang/Library/CloudStorage/OneDrive-GCF/Documents/R/Test w R/Project stages 131122.xlsx") Project_stages_1 <- Project_stages%>% filter(Stage %in% c("00. PI received", "01. Stage 3: CN received", "04. Stage 4: FP received", "14. Stage 6: Approved")) %>% spread(key = Stage, value = 'Day of Stage Date') %>% select(`Approved Ref`,Index,PI =`00. PI received`, CN=`01. Stage 3: CN received`, FP=`04. Stage 4: FP received`, Approved='14. Stage 6: Approved') %>% mutate(Project_received= as.Date((ifelse(!is.na(PI), as.character(PI), ifelse(!is.na(CN), as.character(CN), ifelse(!is.na(FP), as.character(FP), "")))), format="%Y-%m-%d")) %>% filter(Index==1) %>% mutate(duration= as.numeric(difftime(Approved,Project_received, units = "days")), Sub_Year= as.numeric(format(Project_received, format= "%Y"))) # 汇总数据存到p,图表单独存到p_plot p <- Project_stages_1 %>% select(duration, Sub_Year) %>% group_by(Sub_Year) %>% summarise(Avrg= round(mean(duration)), Mdn= round(median(duration))) p_plot <- ggplot(p, aes(x= Sub_Year, y= Avrg)) + geom_bar(stat = "identity", fill="#a13458") + theme_minimal() + ggtitle("Duration of project submission to GCF") # 调整管道顺序,正确生成pptx read_pptx() %>% add_slide("Title and Content", "Office Theme") %>% ph_with(dml(ggobj = p_plot), ph_location()) %>% print(target = here("results2.pptx"))
额外提示
- 补充了
readxl包的加载,因为read_excel()属于这个包,避免环境中未加载导致的报错。 - 如果要在R Markdown里预览图表,直接调用
p_plot即可。
内容的提问来源于stack exchange,提问作者user133737
相关产品推荐
相关产品推荐

