在 Shiny App 中重置 fileInput
Resetting fileInput in Shiny App
我已经尝试了很长时间在 Shiny 应用程序中重置 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)
我最初 select csv
选项并且能够加载 csv 文件。现在,当我按下重置按钮时,它会清除数据。一旦我 select xls
选项,我得到一个错误:
Listening on http://127.0.0.1:4135
Warning: Error in : Unknown file extension: csv
这让我相信 input$inFile$datapath
仍然包含我之前 select 编辑的 csv 文件的路径名。我 运行 不知道如何解决这个问题,非常感谢您的帮助。
理想情况下 fileInput
会正确重置,但您可以将此作为解决方法。添加一个显式标志变量 (rv$clear
) 以指示您是否处于已清除状态,并在发生重置和上传时分别在 high-priority 观察者中打开和关闭它。
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)
我已经尝试了很长时间在 Shiny 应用程序中重置 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)
我最初 select csv
选项并且能够加载 csv 文件。现在,当我按下重置按钮时,它会清除数据。一旦我 select xls
选项,我得到一个错误:
Listening on http://127.0.0.1:4135
Warning: Error in : Unknown file extension: csv
这让我相信 input$inFile$datapath
仍然包含我之前 select 编辑的 csv 文件的路径名。我 运行 不知道如何解决这个问题,非常感谢您的帮助。
理想情况下 fileInput
会正确重置,但您可以将此作为解决方法。添加一个显式标志变量 (rv$clear
) 以指示您是否处于已清除状态,并在发生重置和上传时分别在 high-priority 观察者中打开和关闭它。
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)