【问题标题】:Shiny Download Dataset Inside Zip FolderZip 文件夹内的闪亮下载数据集
【发布时间】:2021-09-02 07:20:00
【问题描述】:

我正在构建我的第一个闪亮的应用程序。作为这个项目的一部分,我想让访问者可以下载。具体来说,我希望访问者能够下载他们选择为 csv 文件但位于 zip 文件夹中的数据。这样当访问者点击下载按钮时,他们会在他们的计算机上获得一个 zip 文件夹,其中包含他们选择的数据的 csv 文件。我想这样做是因为我会将其他文件添加到下载中,因此 zip 文件夹是执行此操作的最佳方式。

我写了下面的代码,不幸的是,代码没有产生预期的输出,因为没有下载任何东西,我收到以下消息:

有什么帮助吗?

Listening on http://127.0.0.1:5942
    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid

# Creation of APP ------------------------------------------
remove(ui, server)

if (interactive()) {
  
  library(shiny)
  library(shinyWidgets)
  library(shinythemes)
  library(shinycssloaders)
  library(shinydashboard)  
  
##########
  
choices_picker_cny <- unique(codebook$Polygon)
names(choices_picker_cny) <- unique(codebook$Label)  

# Define UI -----------------------------------------------
ui <- fluidPage(
  
  # Application title
  titlePanel("Example Shiny App"),
  
  # Parameters
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "input_period", label = "Period",
                  choices = c("2001" = "year_1", "2002" = "year_2", "2003" = "year_3")),
      pickerInput(
        inputId = "picker_cny",
        label = "Select Polygon",
        choices = choices_picker_cny,
        options = list(`actions-box` = TRUE),
        multiple = TRUE),
      selectInput(inputId = "input_variable", label = "Variable",
                  choices = c("Variable A" = "Variable1", "Variable B" = "Variable2", "Variable C" = "Variable3", "Variable D" = "Variable4")),
      downloadButton('downloadData', 'Download Selected Data', icon = shiny::icon("download")),
      width = 2),
    
    # Displat the reactive map
    mainPanel(
      DTOutput("t1"),
      width = 10)
  ))

# Define Server ------------------------------------------
server <- function(input, output, session) {
  
  output$t1 <- renderDT({
    # Display data only when one polygon is selected
    code1 <- codebook[codebook$Year == input$input_period & codebook$Variable == input$input_variable & (codebook$Polygon %in% input$picker_cny),]
    
    code1
  })
  
  
  # Reactive value for selected dataset ----
  datasetInput <- reactive({
    codebook[codebook$Year == input$input_period & codebook$Variable == input$input_variable & (codebook$Polygon %in% input$picker_cny),]
  })
  
  output$downloadData <- downloadHandler(
    
    filename = function() {
      paste("extract_", print(Sys.Date()), ".zip", sep = "")
    },
    
    content = function(file) {
      write.csv(datasetInput(), file, row.names = FALSE)
      zip(file, "extract.csv")
    },
    contentType = "application/zip"
  )
  
  
  # Reactive pickerInput ---------------------------------
  observeEvent(input$input_period, {
    
    # Generate reactive picker input
    code1 <- codebook[codebook$Year %in% input$input_period,]
    codeu <- unique(codebook$Polygon)
    code1u <- unique(code1$Polygon)
    disabled_choices <- ifelse(codeu %in% code1u, 0,1)
    #print(disabled_choices)
    updatePickerInput(session = session,
                      inputId = "picker_cny",
                      choices = choices_picker_cny,
                      choicesOpt = list(
                        disabled = disabled_choices,
                        style = ifelse(disabled_choices,
                                       yes = "color: rgba(119, 119, 119, 0.5);",
                                       no = "")
                      )
    )
  }, ignoreInit = TRUE)
  
}

# Run the application
shinyApp(ui = ui, server = server)
}

这是数据:

structure(list(X = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Polygon = c("polygon_a", 
"polygon_a", "polygon_a", "polygon_a", "polygon_a", "polygon_a", 
"polygon_a", "polygon_a", "polygon_b", "polygon_b", "polygon_b", 
"polygon_b", "polygon_b", "polygon_b", "polygon_b", "polygon_b", 
"polygon_c", "polygon_c", "polygon_c", "polygon_c"), Label = c("Baron Dubois", 
"Baron Dubois", "Baron Dubois", "Baron Dubois", "Baron Dubois", 
"Baron Dubois", "Baron Dubois", "Baron Dubois", "Baron Delasalle", 
"Baron Delasalle", "Baron Delasalle", "Baron Delasalle", "Baron Delasalle", 
"Baron Delasalle", "Baron Delasalle", "Baron Delasalle", "Baron Istog", 
"Baron Istog", "Baron Istog", "Baron Istog"), Year = c("year_1", 
"year_1", "year_1", "year_1", "year_2", "year_2", "year_2", "year_2", 
"year_1", "year_1", "year_1", "year_1", "year_2", "year_2", "year_2", 
"year_2", "year_1", "year_1", "year_1", "year_1"), Variable = c("Variable1", 
"Variable2", "Variable3", "Variable4", "Variable1", "Variable2", 
"Variable3", "Variable4", "Variable1", "Variable2", "Variable3", 
"Variable4", "Variable1", "Variable2", "Variable3", "Variable4", 
"Variable1", "Variable2", "Variable3", "Variable4"), Value = c(1L, 
245L, 23L, 2L, 0L, 34L, 1L, 245L, 1L, 23L, 2L, 0L, 0L, 34L, 0L, 
34L, 0L, 34L, 90L, 9L)), class = "data.frame", row.names = c(NA, 
-20L))

谢谢!

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我会尝试:

    content = function(file) {
      tmpCSV <- tempfile(fileext = ".csv")
      write.csv(datasetInput(), tmpCSV, row.names = FALSE)
      zip(file, tmpCSV)
    },
    

    【讨论】:

    • 嗨斯蒂芬,temp.file 似乎是未知的。我要添加一个新库吗?
    • @AnEostig 对不起,这是tempfile
    • 嘿@Stephan;它工作得很好,唯一的问题是我的 .csv 最终在 ZIP 内的 6 个文件夹下。 var>folders>4p>b5y1st3s66s__wxn7ws387bc0000gn>T>RtmpoOtFhE>file98827d314c20.csv 你知道如何解决这个问题吗?
    • @AnEostig 不确定,但我会尝试tmpCSV &lt;- file.path(dirname(file), "extract.csv")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2016-05-02
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多