Загрузка архивированных файлов PNG в R Shiny

#r #shiny

#r #блестящий

Вопрос:

Я пишу приложение R Shiny (которое я хочу разместить на сервере Shiny), которое будет загружать PNG-файлы из API, отображать их на экране, а затем разрешать пользователю загружать их в виде ZIP-файла. Я не могу, хоть убейте, понять, как архивировать PNG. Мне удалось заставить приложение запрашивать загрузку PNG при локальном запуске. Код приведен ниже. Я ценю любую помощь.

ui.R:

 library(shiny)
    shinyUI(fluidPage(
    
        titlePanel("Modified Script"),
    
        sidebarLayout(
            inputPanel(
                textInput("URL","TEXT", ""),
                submitButton("Update View", icon("refresh"))),
    
            mainPanel(
                htmlOutput("images"),
                
                    titlePanel('Downloading Data'),
                    sidebarLayout(
                        sidebarPanel(
                            downloadButton('imgs', 'Download')
                        ),
                        mainPanel()
                    )
                )
            
                )
        )
    )
  

server.R:

 library(shiny)
library(httr)
library(jsonlite)

shinyServer(function(input, output, session) {

 imgFiles <- reactiveValues(mat=NULL)
        
 output$images <- renderText({
      dURL = input$URL
      dId = gsub("\?.*","",gsub('.*/', '', dURL))
      dJson = paste0('[api Location]',dID,'/export/json')
        
        tech = GET(dJSON)
        data = fromJSON(rawToChar(tech$content))
        
        nImage = data$image
        nName = data$name
            
       
        withProgress(message = 'Making plot', value = 0, {
          # Number of times we'll go through the loop
        n <- length(nImage)
        
        count<-0
        images1<-NULL
        images2<-NULL
        destFile<-NULL
        for (x in nImage){
          destFile = paste0(nName[(count 1)],'.png')
          images = c('<img src="',x,'" width=10% height=10%>',images)

          Sys.sleep(.69)
          count = count 1
          
          incProgress(1/n, detail = paste("Doing part", x))
         
          imgFiles$html <- image1
          imgFiles$imgs <- nImage
          imgFiles$names<- nName
          
           }     
        })
        print(imgFiles$html)
        
       })
      
 output$imgs<-renderText({
   
   as.vector(imgFiles$imgs)
 })
})
  

Комментарии:

1. Это может вам помочь. mastering-shiny.org/action-transfer.html#download

2. @MritiAgarwal Я знаю, что downloadHandler — это то, где в конечном итоге лежит ответ на этот вопрос. Я устал разрабатывать функцию содержимого, которая позволит мне zip () PNG вместе, и, похоже, ничего не работает. ЭТО работает локально, но запрашивает сохранение каждого отдельного файла. Как только он находится на сервере, он запрашивает только последний.

Ответ №1:

Я нашел способ заставить его работать, используя tar вместо zip . Я собираюсь еще немного поиграть с этим, но, похоже, это работает на сервере Shiny.

  output$imgs <- downloadHandler(
       filename = "DownloadPNGs.tar",
       
       content = function(file){
        
          tmpdir <- tempdir()
          setwd(tempdir())
          count<-0
          for (i in imgFiles$imgs){
            path <-paste0(imgFiles$names[count 1],".png")
            download.file(i,path,mode="wb")
            Sys.sleep(.69)
            count=count 1
       }
        tar(tarfile = file,files=tmpdir)
    }
     )