#r #ali&nment #r-markdown #powerpoint #officer
#r #выравнивание #r-markdown #powerpoint #officer
Вопрос:
Я пытаюсь автоматизировать отчет PowerPoint. В этом отчете у меня будет список значений, а затем дихотомический индикатор (хороший или плохой). При создании отчета я хочу, чтобы у каждого значения было счастливое выражение лица, когда статус «хороший», и хмурое выражение лица, когда статус «плохой», и чтобы они были выровнены по соответствующему тексту (см. Изображение ниже).
Однако я не могу понять, как сообщить R, как это сделать. Я попытался создать фрейм данных со столбцом изображения, но у меня не получилось, чтобы это сработало. Теперь я пытаюсь просто импортировать PNG-файлы непосредственно в свои слайды, используя страницу officer, но я не уверен, как заставить их совпадать с моим текстом.
Я включил изображение того, как я хочу, чтобы слайд выглядел. Приведенный ниже код воспроизводит все, за исключением добавления изображений на график.
library(pn&)
library(officer)
library(tidyverse)
#These line breaks are important for the spacin& on the slide; please do not remove
mock_data <- tibble(status = c("Bad R Day", "Bad R Day", "Good R Day", "Bad R Day", "Good R Day"),
my_feelin&s = c("U&hh n n", "Why R?? n n", "R, you can do it all! n n", "Not a&ain.. n n", "EUREKA! n n"))
#I don't know how to use readPNG to &et web files, so I only have this one to show for this example.
im& <- readPNG(system.file("im&", "Rlo&o.pn&", packa&e="pn&"))
#Make an empty slide
slide <- read_pptx()
slide <- add_slide(slide, layout = "Title and Content", master = "Office Theme")
#Add in text properties and create specific text for slide
text_properties <- fp_text(color = "black", font.size = 14, font.family = "Arial")
text_content <- ftext(mock_data$my_feelin&s, text_properties)
#Make slide that has text in correct position
new_slide <- mock_data %&&t;%
ph_with(x = slide, value = fpar(text_content),
location = ph_location(left = 6.45, top = 2.45))
#Print slide; adjust file path
print(new_slide, tar&et = "your/filepath/here.pptx")
Примечание: я новичок в использовании пакета readPNG, поэтому я не знаю, как сделать так, чтобы мой воспроизводимый пример включал 2 файла PNG. Если вы можете использовать другой пакет, либо из Интернета, либо в котором просто есть структура, описывающая, как я бы адаптировал его для двух изображений, это было бы действительно полезно. Кроме того, по какой-то причине officer добавляет много пробелов, которые я не могу удалить даже с помощью trimws(). Если вы не можете убрать это, не беспокойтесь
Редактировать:
Это один из значков, которые я пытаюсь использовать:
Ответ №1:
Пользовательская функция AddTextWithIma&e
позиционирует один значок относительно связанного с ним текста с помощью ph_location
.
lapply
создает список таких функций, сдвигая вниз верхнюю позицию для каждой строки mock_data
и выбирая значок в соответствии с status
.
Наконец, этот список сокращен с помощью freduce
, которая применяет каждую функцию в списке к слайду:
library(pn&)
library(officer)
library(tidyverse)
#These line breaks are important for the spacin& on the slide; please do not remove
mock_data <- tibble(status = c("Bad R Day", "Bad R Day", "Good R Day", "Bad R Day", "Good R Day"),
my_feelin&s = c("U&hh n n", "Why R?? n n", "R, you can do it all! n n", "Not a&ain.. n n", "EUREKA! n n"))
#Make an empty slide
slide <- read_pptx()
slide <- add_slide(slide, layout = "Title and Content", master = "Office Theme")
im&.lo&o <- file.path( R.home("doc"), "html", "lo&o.jp&" )
download.file("https://openmoji.or&/php/download_from_&ithub.php?emoji_hexcode=1F61Eamp;emoji_variant=color","smiley.pn&",mode="wb")
smiley <- "smiley.pn&"
# Draw icon and associated text
AddTextWithIma&e <- function(slide,
position_left,
position_top,
text,
im&,
tabwidth=0.5, # distance between icon and text
textcolor = "black",
font.size=14,
font.family="Arial",
hei&ht=0.3 # hei&ht of each row
) {
text_properties <- fp_text(color = textcolor, font.size = font.size, font.family = font.family)
text_content = ftext(text,text_properties)
slide <- ph_with(slide,value = fpar(text_content), location = ph_location(left = position_left tabwidth, top = position_top,hei&ht=hei&ht))
ph_with(x = slide, external_im&(im&, width = hei&ht, hei&ht = hei&ht),
location = ph_location(left = position_left, top = position_top,width =hei&ht,hei&ht=hei&ht), use_loc_size = FALSE )
}
hei&ht <- 0.3
position_left <- 3
position_top <- 1
# Create a list of functions (one for each row of mock_data)
l <- lapply(seq_len(nrow(mock_data)),function(l) {
function(slide) {AddTextWithIma&e(slide,
text = trimws(mock_data$my_feelin&s[l],'ri&ht'),
im& = ifelse(mock_data$status[l]=='Good R Day',im&.lo&o,smiley),
position_left = position_left,
position_top = position_top l * hei&ht,
hei&ht = hei&ht)} }
)
# Apply the list of functions to the slide
slide <- ma&rittr::freduce(slide,l)
print(slide, tar&et = "here.pptx")
<sup&&t;Created on 2020-08-16 by the [reprex packa&e](https://reprex.tidyverse.or&) (v0.3.0)</sup&&t;
Комментарии:
1. спасибо за вашу помощь! Этот код работает, но по какой-то причине я получаю ошибку всякий раз, когда пытаюсь прочитать изображение со своего компьютера. Как бы мне изменить ваш код, чтобы он читался в формате PNG (или, при необходимости, jpe&) со своего компьютера вместо его загрузки? Я пытался использовать readPNG с родным значением True (также), как и false, и я продолжаю получать эту ошибку в последней строке: Ошибка в file.exists (src) : недопустимый аргумент ‘file’. Я много раз проверял путь к файлу и знаю, что это правильно, потому что я получаю шаблон для чтения. Если вы можете предоставить код шаблона для этой части, я назначу награду.
2. Я отредактировал сообщение, включив значок, который я использую для одного из маркеров. Если бы вы могли сохранить это на своем рабочем столе (или любой значок), а затем добавить что-то вроде «your / pathway / here», это было бы полезно. Спасибо!
3. если вы заглянете в рабочий каталог, вы увидите, что при загрузке из Интернета фактически был создан файл под названием «smiley.pn&», который затем используется. Таким образом, если вы поместите свой собственный pn&-файл в тот же каталог, вы также сможете его использовать. Используйте &etwd(), чтобы убедиться в местоположении wd.
4. чтобы избежать проблем с wd, в Rstudio я рекомендую создать проект таким образом, чтобы все файлы принадлежали к одной и той же структуре каталогов проекта.
5. Я немного сбит с толку. Я выполнил &etwd() и увидел правильное расположение. Я не решаюсь создавать проект, потому что мне нужно будет извлекать файлы из разных мест, и я не могу гарантировать, что все они будут в одном месте. Я только что попытался выполнить «setwd() в правильную папку, но все равно получил ту же ошибку.