Принимает ли офицерский пакет объект ggsurvplot?

Я безуспешно пытаюсь экспортировать объект ggsurvplot в PowerPoint с помощью пакета Officer. Мне удалось найти множество инструкций о том, как использовать для этого уже полный ReporterS-пакет, и несколько упоминаний о том, что офицер тоже должен работать. Кажется, в документации нет ничего, что упоминает об этом. Так должно ли это вообще работать? Можно ли с помощью этих инструментов получить векторизованный график выживания на pptx-слайде?

totsur <- ggsurvplot(yhd1,
           data = sappivertailu,
           combine=TRUE,
           xlab = "Time, months", 
           ylab="Survival", 
           title="Overall survival",
           lwd=2,
           palette="jco",
           xscale = "d_m",
           xlim = c(0,730.5),
           break.x.by = 91.3,
           risk.table = TRUE,
           pval = TRUE,
           fontsize = 3)
totsur
my_vec_graph <- dml(code = totsur)

doc <- read_pptx()
doc <- add_slide(doc, layout = "Overall survival", master = "Office Theme")
doc <- ph_with(doc, my_vec_graph, location = ph_location_fullsize() )
print(doc, target = "Sappitutkimus/Charts/survi1.pptx")

Смена dml(ggobj = totsur) тоже не работает. Что я делаю неправильно?

Изменить: Спасибо за все комментарии ниже! И еще одно обновление. В данных не было ничего плохого. После небольшой отладки мои исходные данные дали желаемый результат.

Остается одна проблема. Кажется, что пакет не может добавить на один слайд таблицу рисков и кривую выживаемости. Да, вы можете пройти это, сделав два отдельных графика на разных слайдах, но я не думаю, что это хорошая практика.

Если я не ошибаюсь, у офицера и репортеров есть общий код, и эта проблема тоже присутствовала. https://github.com/kassambara/survminer/issues/314

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

yhd1 <- survfit(Surv(sappivertailu$Survi, sappivertailu$Kuolema) ~ Arm, data=koe)

totsur <- 
  ggsurvplot(yhd1,
           combine = TRUE,
           data = sappivertailu,
      #     risk.table = TRUE,
           pval = TRUE,
           fontsize = 3
           )
totsur
my_vec_graph <- rvg::dml(ggobj = last_plot())

doc <- read_pptx()
doc <- add_slide(doc, layout = "Title and Content", master = "Office Theme")
doc <- ph_with(doc, my_vec_graph, location = ph_location_fullsize() )
print(doc, target = "Sappitutkimus/Charts/survi1.pptx")

Редактировать: o 2: И подсказка о желаемом результате. Число подверженных риску таблиц включено


person Lauri Pautola    schedule 24.01.2021    source источник
comment
Разве вы не можете экспортировать как pdf и импортировать в pptx как вектор?   -  person jared_mamrot    schedule 24.01.2021
comment
Ага. Я могу делать это поэтапно, и все работает нормально. Также работает сохранение в .eps. Однако ради рабочего процесса я был бы очень признателен за возможность заставить R выполнить эту работу и создать готовый pptx со всей необходимой информацией.   -  person Lauri Pautola    schedule 24.01.2021


Ответы (1)


Конечно, вы могли бы экспортировать ggsurvplots. в pptx через officer. В вашем коде есть две проблемы. Сначала вам нужно использовать rvg::dml(ggobj = ...). Во-вторых, вы устанавливаете layout = "Overall survival". Но нет макета с таким именем в pptx по умолчанию, поставляемом с officer, т.е. вы можете использовать только макеты, которые присутствуют в шаблоне pptx. Устранение обеих проблем и использование базового примера из документации ggsurvplot:

require("survival")
#> Loading required package: survival
library(survminer)
#> Loading required package: ggplot2
#> Loading required package: ggpubr
library(officer)

fit<- survfit(Surv(time, status) ~ sex, data = lung)

# Basic survival curves
ggsurvplot(fit, data = lung)


my_vec_graph <- rvg::dml(ggobj = last_plot())

doc <- read_pptx()
doc <- add_slide(doc, layout = "Title and Content", master = "Office Theme")
doc <- ph_with(doc, my_vec_graph, location = ph_location_fullsize() )
print(doc, target = "survi2.pptx")

введите описание изображения здесь

РЕДАКТИРОВАТЬ Если вы хотите, чтобы на одном слайде было несколько материалов, вы можете изменить макет на Two Content и использовать ph_location_left/right:

doc <- read_pptx()
doc <- add_slide(doc, layout = "Two Content", master = "Office Theme")
doc <- ph_with(doc, my_vec_graph, location = ph_location_left() )
doc <- ph_with(doc, my_vec_graph, location = ph_location_right() )
print(doc, target = "survi2.pptx")
person stefan    schedule 24.01.2021
comment
Большое спасибо! Так что это работает, и это легко воспроизводимо. Сделал обе модификации. Однако моя исходная диаграмма все еще не распечатывается. Он дает следующее предупреждение: Ошибка в read_xml.raw (charToRaw (enc2utf8 (x)), UTF-8, ..., as_html = as_html,: StartTag: недопустимое имя элемента [68] Это не связано ни с одним из аргументов в ggsurvplot . Также не работает удаление меток с используемых векторов. Есть идеи? - person Lauri Pautola; 24.01.2021
comment
Привет, Лаури. Вы изменили rvg::dml(ggobj = ... ?? Я спрашиваю, потому что, когда я использую rvg::dml(code = ..., я получаю точно такое же сообщение об ошибке, что и вы. - person stefan; 24.01.2021
comment
Еще раз спасибо, глупая ошибка! Теперь я могу получить сюжет с тем же самым кодом, который вы только что дали. Тем не менее, у меня есть проблема. Теперь, когда я использую аргумент last_plot (), он создает только таблицу рисков. Если я попытаюсь обойти это, поместив ggsurvplot в объект и поместив его вместо last_plot (), сеанс R полностью выйдет из строя без обратной трассировки. То же самое происходит, если я сначала распечатываю график, а затем использую last_plot (). Поскольку данные изначально импортируются из SPSS-файла и обрабатываются в R, я полагаю, может быть какая-то проблема с типом данных? - person Lauri Pautola; 24.01.2021
comment
Хорошо, короткое обновление. Причина падения снова была глупой. У меня был Powerpoint и открываемый файл. Итак, в Officer есть ошибка, но ее легко обойти. Теперь я могу получить таблицу рисков для pptx, но не кривые выживаемости. Я немного поиграю с этим и посмотрю, действительно ли тип данных в исходном наборе данных вызывает проблемы. - person Lauri Pautola; 25.01.2021
comment
Небольшое замечание. Я отредактировал исходный пост и поместил туда, надеюсь, последний выпуск. Код теперь работает нормально, и данные не были проблемой, но, похоже, получить таблицу рисков и кривую выживаемости на одном слайде. Надеюсь, вы или кто-то еще знает способ обойти это. - person Lauri Pautola; 25.01.2021
comment
Не уверен в желаемом конечном результате. Но если вы хотите, чтобы на одном слайде было два содержимого, вы можете переключить макет. Смотрите мою правку. - person stefan; 25.01.2021
comment
О да. Смотрите мою новую правку. У меня возникла такая же идея, но я отказался от нее по нескольким причинам. Во-первых, вам нужно создать два похожих объекта ggsurvplot. Еще один без таблицы рисков и еще один с. Поскольку мне удалось получить работу метода last_plot (), он должен был находиться между двумя фрагментами. Вторая причина в том, что довольно сложно создать читаемую таблицу рисков, и такой сложный метод вызовет суету. Последняя причина заключалась в том, что мне не удалось найти ph_location_template или другой аргумент, которым можно было бы управлять желаемым образом. Придется найти что-нибудь еще. - person Lauri Pautola; 26.01.2021
comment
Хорошо, еще немного исследований, и я нашел это. github.com/davidgohel/officer/issues/244 Так что на случай, если я добавлю риск table, ggsurvplot создает две графики, одна из которых пуста, и это мешает офицеру. Так что это может быть ошибка в Survminer. - person Lauri Pautola; 26.01.2021