Удаление графиков, изображений и кадров данных из PowerPoint с помощью R - PullRequest
0 голосов
/ 18 марта 2020

Мое намерение состоит в том, чтобы иметь возможность обновлять Powerpoint, который я сгенерировал в R, без необходимости создавать новую колоду. Чтобы это работало, мне нужно иметь возможность каким-либо образом удалять или перезаписывать контент, который присутствует в ранее созданной колоде Power Point.

Насколько я могу судить, ph_remove только кажется быть единственным фрагментом кода, который делает это. К сожалению, насколько я могу судить, он работает только с текстом, а не с графиками, фреймами данных или изображениями.

Вот пример кода:

Этот код генерирует колоду ppt с каждым типом объекта:

path_out <- [insert folder directory]

# prep ggplot
p1 <- iris %>% 
  ggplot() +
  geom_point(aes(Sepal.Length,Petal.Length,color = Species), size = 3) +
  theme_minimal()

# prep image
img.file <- file.path(R.home("doc"),"html","logo.jpg")

# prep flextable
ft <- flextable(head(mtcars)) %>%
  autofit()

# prep editable graph (rvg)
p2 <- dml(ggobj = p1)

my_pres <- read_pptx() %>%
  #slide 1
  add_slide(layout = "Title and Content", master = "Office Theme") %>%
  ph_with(value = "Hello World", location = ph_location_type(type = "title")) %>% 
  ph_with(value = "A footer", location = ph_location_type(type = "ftr")) %>% 
  ph_with(value = format(Sys.Date()), location = ph_location_type(type = "dt")) %>% 
  ph_with(value = "Hello world", location = ph_location_type(type = "body")) %>%
  #slide 2
  add_slide() %>%
  ph_with(value = p1, location = ph_location_type("body")) %>% 
  #slide 3
  add_slide() %>%
  ph_with(external_img(img.file, width = 1.39, height = 1.06), location = ph_location_type("body"), use_loc_size = F) %>% # plot an image of specific size
  #slide 4
  add_slide() %>%
  ph_with(ft, location = ph_location(type = "body")) %>%
  #slide 5
  add_slide() %>%
  ph_with(p2, location = ph_location_type("body")) %>% # create a graph that can be edited
  print(target = paste0(path_out,"example_v1.pptx"))

Этот код пытается удалить эти объекты из созданной колоды:

mypres2 <- read_pptx(paste0(path_out,"example_v1.pptx")) %>%
  on_slide(index = 1) %>% 
  ph_remove(type = "title") %>% 
  ph_remove(type = "ftr") %>%
  ph_remove(type = "dt") %>%
  ph_remove(type = "body") %>%
  on_slide(index = 2) %>% 
  ph_remove(type = "body") %>%
  on_slide(index = 3) %>% 
  ph_remove(type = "body") %>%
  on_slide(index = 4) %>%
  ph_remove(type = "body") %>%
  on_slide(index = 5) %>%
  ph_remove(type = "body") %>%
  print(target = paste0(path_out,"example_v2.pptx"))

Кто-нибудь знает любой метод, который позволил бы мне удалить их без необходимости вручную заменить их или снова создать колоду с нуля?

1 Ответ

0 голосов
/ 18 марта 2020

ph_remove удаляет любую существующую фигуру - не только текст. Я сократил ваш пример, но попытался заставить его использовать разные типы объектов для демонстрации ph_remove. Используя new_label в ph_location_type, вы можете легко создавать уникальные метки, связанные с формой, и использовать их позже.

library(flextable)
library(rvg)
library(officer)
library(magrittr)
library(ggplot2)

path_out <- "."

# prep ggplot
p1 <- iris %>% 
  ggplot() +
  geom_point(aes(Sepal.Length,Petal.Length,color = Species), size = 3) +
  theme_minimal()

# prep image
img.file <- file.path(R.home("doc"),"html","logo.jpg")

# prep flextable
ft <- flextable(head(mtcars)) %>%
  autofit()

# prep editable graph (rvg)
p2 <- dml(ggobj = p1)

my_pres <- read_pptx() %>%
  #slide 1
  add_slide(layout = "Title and Content", master = "Office Theme") %>%
  ph_with(value = "Hello World", location = ph_location_type(type = "title", newlabel = "ouaoua")) %>% 
  ph_with(value = "A footer", location = ph_location_type(type = "ftr", newlabel = "ouaoui")) %>% 
  ph_with(value = format(Sys.Date()), location = ph_location_type(type = "dt", newlabel = "ouaoue")) %>% 
  ph_with(value = flextable(head(iris)), location = ph_location_type(type = "body", newlabel = "ouaouo")) %>%
  #slide 2
  add_slide() %>%
  ph_with(value = dml(ggobj = p1), location = ph_location_type("body", newlabel = "ouaoua")) %>% 
  print(target = file.path(path_out,"example_v1.pptx"))

enter image description here

mypres2 <- read_pptx(file.path(path_out,"example_v1.pptx")) %>%
  on_slide(index = 1) %>% 
  ph_remove(ph_label = "ouaoua") %>% 
  ph_remove(ph_label = "ouaoui") %>% 
  ph_remove(ph_label = "ouaoue") %>% 
  ph_remove(ph_label = "ouaouo") %>% 
  on_slide(index = 2) %>% 
  ph_remove(ph_label = "ouaoua") %>%
  print(target = file.path(path_out,"example_v2.pptx"))

enter image description here

...