如何在Shiny中重置fileInput的值?

时间:2017-05-26 14:10:19

标签: r shiny

关于这个问题已经有类似的帖子(例如how can I update a shiny fileInput object?),但我仍然无法弄清楚人们如何强迫Shiny在input$file小部件之后忘记fileInput的值使用。

如果想要使用actionButton(在我的情况下称为"Submit")触发上传文件,然后使用另一个actionButton"Reset"重置其值,则问题会变得唠叨} 这里)。 再次点击“提交”按钮时,很明显输入的$ file值仍然存在。

我尝试使用一些推荐的解决方案:shinyjs包和使用fileInput / renderUI刷新uiOutput模块 - 但仍然没有结果。

这是我的代码:

server.R

shinyServer(function(input, output, session) {

values <- reactiveValues(
 file = NULL
)

observeEvent(input$submit, {
 values$file <- input$file1
})

observeEvent(input$reset, {
 values$file <- NULL
 output$resettableInput <- renderUI({
  fileInput('file1', label = NULL)
 })
}, ignoreNULL = F)

output$summary <- renderText({
 return(paste('Uploaded file:', values$file$name))
})
})

ui.R

shinyUI(bootstrapPage(

 headerPanel('Reset / Submit file input example'),

 sidebarPanel(

  uiOutput('resettableInput'),

  fluidRow(
          column(4,
                 actionButton('reset', 'Reset All')
          ),
          column(4,
                 actionButton('submit', 'Submit')
          )
  )
 ),

 mainPanel(
  h4('Summary'),
  verbatimTextOutput('summary')
 )
))

我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:5)

input$file1由Shiny缓存,因此在下次上传之前不会更改。

由于您希望文件名变量在大多数时间内映射到input$file1$name,但在单击重置按钮时重置为NULL,您需要创建另一个图层并维护此关系。

  • 您可以创建变量upload_state,使用文件上传事件将其设置为uploaded,使用重置按钮将其设置为reset

  • 根据input$file1$name值使用反应式表达式NULLupload_state

不需要submit按钮。

library(shiny)
ui <- shinyUI(bootstrapPage(
  headerPanel("Reset / Submit file input example"),
  sidebarPanel(
    fileInput('file1', label = NULL),
    fluidRow(
      column(4,
             actionButton('reset', 'Reset Input')
      ))
  ),

  mainPanel(
    h4("Summary"),
    verbatimTextOutput("summary")
  )
))

server <- shinyServer(function(input, output, session) {
  values <- reactiveValues(
    upload_state = NULL
  )

  observeEvent(input$file1, {
    values$upload_state <- 'uploaded'
  })

  observeEvent(input$reset, {
    values$upload_state <- 'reset'
  })

  file_input <- reactive({
    if (is.null(values$upload_state)) {
      return(NULL)
    } else if (values$upload_state == 'uploaded') {
      return(input$file1)
    } else if (values$upload_state == 'reset') {
      return(NULL)
    }
  })

  output$summary <- renderText({
    return(paste("Uploaded file:", file_input()$name))
  })
})

shinyApp(ui = ui, server = server)

答案 1 :(得分:1)

我知道这是一篇过时的文章,但是您可以通过在服务器中从头开始重建输入来重置输入。

在ui.R中,您可以输入:

...
uiOutput('file1_ui') ## instead of fileInput('file1', label = NULL)
...

然后在server.R中添加:

...
output$file1_ui <- renderUI({
  input$reset ## Create a dependency with the reset button
  fileInput('file1', label = NULL)
})
...