在Shiny App中重置fileInput

Dhi*_*raj 2 r shiny shinyjs

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

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)
Run Code Online (Sandbox Code Playgroud)

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

Listening on http://127.0.0.1:4135
Warning: Error in : Unknown file extension: csv
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*eng 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)
Run Code Online (Sandbox Code Playgroud)