#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)
}
)