Загрузите список изображений в один PDF-файл из приложения R Shiny - PullRequest
0 голосов
/ 06 августа 2020

Я просмотрел все похожие проблемы, опубликованные в 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:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...