Я просмотрел все похожие проблемы, опубликованные в StackOverflow, и, похоже, ни одна из них не может быть адаптирована для решения моей проблемы (поэтому, пожалуйста, не помечайте как повторяющиеся). Я постарался сделать представление как можно более лаконичным ... Заранее спасибо за любую помощь.
Проблема:
У меня есть набор связанных изображений, пути к файлам которых находятся во фрейме данных, вместе с их категориями и назначениями типа (см. Фрейм данных dput ниже). Когда пользователь нажимает кнопку «Создать изображение», изображения считываются во вложенную структуру списка в соответствии с их категорией и типом, а затем объединяются в один файл jpeg для просмотра в приложении. Эту часть я уже выполнил (см. Логи сервера R Shiny c ниже). Однако я также хотел бы, чтобы пользователь имел возможность загружать этот список изображений в виде единого PDF-файла, с каждой строкой / типом изображения на отдельной странице (желаемый результат см. Ниже). Я пробовал адаптировать другие решения, которые нашел в Интернете, но, похоже, не могу этого понять. Каждая попытка приводит либо к ошибке файла, либо к полностью пустому pdf.
R Shiny UI и логи сервера c
### Load packages.
library(tidyverse)
library(shiny)
library(magick)
### Define UI.
ui <- fluidPage(
sidebarLayout(
### Sidebar menu with two buttons.
sidebarPanel(fluid = FALSE, width = 2,
actionButton("go", "Generate Image"),
downloadButton("downloadImage", "Download Image")
),
### Main panel to view aggregate image.
mainPanel(
imageOutput("img")
)
)
)
### Define server logic.
server <- function(input, output, session) {
# Dput dataframe containing URLs to public images and their category/type assignment.
filenames <- structure(list(category = c("animal", "animal", "animal", "animal",
"animal", "nature", "nature", "nature", "nature", "nature"),
type = c("dog", "dog", "dog", "human", "human", "leaf", "leaf",
"flower", "flower", "flower"), img_url = c("https://images.freeimages.com/images/large-previews/ce3/puppies-1-1308839.jpg",
"https://images.freeimages.com/images/large-previews/006/young-dachshund-1362378.jpg",
"https://images.freeimages.com/images/large-previews/20c/my-puppy-maggie-1362787.jpg",
"https://media.istockphoto.com/photos/fitness-picture-id172628456",
"https://media.istockphoto.com/photos/seventy-year-old-man-smiling-picture-id173612705",
"https://images.freeimages.com/images/large-previews/6df/water-drop-on-leaf-1639205.jpg",
"https://images.freeimages.com/images/large-previews/34c/close-up-macro-of-green-leaf-1641721.jpg",
"https://images.freeimages.com/images/large-previews/0cf/tulips-1-1377350.jpg",
"https://images.freeimages.com/images/large-previews/d2f/tulips-1400882.jpg",
"https://images.freeimages.com/images/large-previews/3d3/droplets-1395002.jpg"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
### When the user clicks the "Generate Image" button, this generates a nested list of the
### images, appended by type.
img_list <- eventReactive(input$go, {
by(filenames, filenames$category, function (cat) {
by(cat, cat$type, function (t) {
pull(t, img_url) %>%
image_read() %>%
image_scale("x200") %>%
image_join() %>%
image_append()
})
})
})
### Render aggregated image for viewing in the app.
output$img <- renderImage({
req(input$go)
tmpfile <- image_join(img_list()) %>%
image_append(stack = TRUE) %>%
image_write(tempfile(fileext = '.jpg'), format = 'jpg')
list(src = tmpfile, contentType = "image/jpeg")
}, deleteFile = FALSE)
### Download image.
output$downloadImage <- downloadHandler(
filename = "images.pdf",
contentType = "application/pdf",
content = function(file) {
### Here is where I'm stuck!
###
### The list of images I want to print is stored in img_list()
### and rows of images are already correctly appended. I just
### can't figure out how to print each level of the nested
### list to a separate page in the pdf.
}
)
### Stop 'listening' when browser window is closed.
session$onSessionEnded(function() {
stopApp()
})
}
shinyApp(ui = ui, server = server)
My желаемый результат выглядит как это, где черные линии представляют разрыв страницы в загруженном PDF:
введите описание изображения здесь