You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因与修复方案

问题根源

  1. 变量p是数据框而非ggplot对象:你把汇总后的统计数据存到了p里,而ggplot()生成的图表没有赋值给任何变量,导致dml(ggobj = p)传入的是数据框,不符合函数要求,触发报错。
  2. 管道顺序逻辑错误:你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:55:03