Как использовать аргумент индекса в функции ph_with_text из офицерского пакета - PullRequest
0 голосов
/ 01 февраля 2019

Ciao,

Я работаю над пользовательской презентацией pptx, используя пакет офицер на R. Правда в том, что я портирую кодовую форму Репортеры .

Мой вопрос касается структуры макета.Отправной точкой является пустой pptx, который я загружаю для импорта тем и настроек форматирования;В частности, я не использую

ppt <- read_pptx()

для создания pptx, а скорее импортирую его из существующего файла:

ppt <- read_pptx("Blank_officer.pptx")

Вот как это стандартная схема слайдов enter image description here

Проблема в том, что я не знаю, как заполнять поля в этой точке.Вот чего я хочу достичь:

enter image description here

Я попытался использовать следующий код:

ppt <- read_pptx( ROOT_PATH( "template/Blank_officer.pptx" ) )
ppt <-  ppt <- add_slide( ppt, "Internal Slide - 1 Column Text", master = "Blank" )

ppt <- ph_with_text(x = ppt, str = "A Title", type = "title")
ppt <- ph_with_text(ppt, "Bullet text 4", type = "body", index = 4)
ppt <- ph_with_text(ppt, "Bullet text 11", type = "body", index = 11)
ppt <- ph_with_text(ppt, "\nBullet text 11.2", type = "body", index = 11)
ppt <- ph_with_text(ppt, 2, type = "sldNum")

print( ppt, target = "officerTest.pptx" )

, и я получаю следующеерезультат: enter image description here

Кажется, все в порядке, но правда в том, что я выбираю аргумент index методом "попробуй и проваливай", т.е. случайным образомвыберите значение и посмотрите, что произойдет.

Можете ли вы объяснить мне, как работает аргумент индекса?

Есть ли команда, которая показывает мне для данного макета слайда, которыеиндекс, который я могу использовать для записи в текстовом поле?

В качестве альтернативы:

Мне было интересно, существует ли функция, подобная Tab, то есть функция, котораяпозвольте мне перемещаться по текстовому полю, например addParagraph функция в Reporter пакет.

Спасибо за вашу помощь,

Ciao

1 Ответ

0 голосов
/ 05 февраля 2019

В конце я понял.Правда в том, что проблема не тривиальна, так как случается, что значения индекса относятся к разным частям ppt, то есть они изменяются во времени !!!

Это, конечно, означает, что мы не можем использовать целочисленные значения, но мынеобходимо использовать другое отображение 1: 1.

Для этого нам нужно знать названия различных блоков, которые находятся в макете слайда.А именно:

library(officer)
ppt <- read_pptx()
layout_properties( ppt ) 

Этот информационный кадр содержит информацию о структуре макета слайда.В частности, название слайда ( имя столбец), тип компонента ( тип столбец) и метка абзаца ( ph_label столбец).

Идея состоит в том, чтобы использовать этот фрейм данных для построения динамической карты, которая для каждого слайда, типа и ph_label будет возвращать правильный индекс.

Для этого я написал следующие функции: pptIndexInfo Функция фильтрует кадр данных макета по имени макета и присваивает объектам прогрессивный индекс (независимо от id ).Фактически (я понятия не имею, почему) мы будем использовать индексы, которые мы только что сгенерировали, а не id значений столбцов.

pptIndexInfo <- function( ppt, layout, master ){
  aux = layout_properties(ppt, master = master, layout = layout)
  aux$index = NA
  for(type in unique(aux$type) ){
    aux[ aux$type == type, "index" ] = 1:length(aux[ aux$type == type, "index" ])
  }
  return(aux)
}

На данный момент нам просто нужно извлечь индекс длятребуемый ph_label .

Title_index <- function(ppt, layout, master){
  pptInd = pptIndexInfo(ppt, layout, master)
  return( pptInd$index[ which(pptInd$ph_label == "Title") ] )
}

Эта функция, например, генерирует отфильтрованный кадр данных макета и извлекает присвоенный индекс для ph_label "Заголовок".

Эти функции полезны, когда выиметь несколько ящиков для одного и того же «типа».

...