首页 文章

在Shiny App中重置fileInput

提问于
浏览
2

我一直试图在一个闪亮的应用程序中重置 fileInput 并阅读类似问题的解决方案,但我的问题仍然存在 . 大多数解决方案最终导致使用Dean Attali的辉煌 shinyjs 包和其中的 reset() 功能 . 以下是遵循these说明后我的代码:

library(shiny)
library(shinyjs) 
library(xlsx) 
library(tidyverse) 

ui <- fluidPage(
  useShinyjs(),
  fileInput('inFile', 'Choose file'),
  actionButton('reset', 'Reset'),
  radioButtons("type","Choose file type",choices = c('csv','xls')),
  tableOutput('tbl')
)

server <- function(input, output, session) {

  rv <- reactiveValues(data = NULL)

  observe({
    req(input$inFile)
    if(input$type=='csv'){
      rv$data <- read.csv(input$inFile$datapath)
    }
    if(input$type=='xls'){
      rv$data <- read_excel(input$inFile$datapath)
    }

  })

  observeEvent(input$reset, {
    rv$data <- NULL
    reset('inFile')
  })

  output$tbl <- renderTable({
    rv$data
  })
}

shinyApp(ui, server)

我最初选择 csv 选项,并能够加载csv文件 . 现在当我按下重置按钮时,它会清除数据 . 一旦我选择 xls 选项,我就会收到一个错误:

Listening on http://127.0.0.1:4135
Warning: Error in : Unknown file extension: csv

这让我相信 input$inFile$datapath 仍然包含我之前选择的csv文件的路径名 . 我已经用尽了如何解决这个问题的想法,并非常感谢一些帮助 .

1 回答

  • 5

    理想情况下 fileInput 会正确重置,但您可以将其作为解决方法 . 添加显式标志变量( rv$clear )以指示您是否处于清除状态,并分别在重置和上载时在高优先级观察器中打开和关闭它 .

    library(shiny)
    library(shinyjs) 
    library(xlsx) 
    library(tidyverse) 
    
    ui <- fluidPage(
      useShinyjs(),
      fileInput('inFile', 'Choose file'),
      actionButton('reset', 'Reset'),
      radioButtons("type","Choose file type",choices = c('csv','xls')),
      tableOutput('tbl')
    )
    
    server <- function(input, output, session) {
    
      rv <- reactiveValues(
        data = NULL,
        clear = FALSE
      )
    
      observe({
        req(input$inFile)
        req(!rv$clear)
    
        if(input$type=='csv'){
          rv$data <- read.csv(input$inFile$datapath)
        }
        if(input$type=='xls'){
          rv$data <- read_excel(input$inFile$datapath)
        }
    
      })
    
      observeEvent(input$inFile, {
        rv$clear <- FALSE
      }, priority = 1000)
    
      observeEvent(input$reset, {
        rv$data <- NULL
        rv$clear <- TRUE
        reset('inFile')
      }, priority = 1000)
    
      output$tbl <- renderTable({
        rv$data
      })
    }
    
    shinyApp(ui, server)
    

相关问题