关于这个问题已经有类似的帖子(例如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')
)
))
我将不胜感激任何帮助。
答案 0 :(得分:5)
input$file1
由Shiny缓存,因此在下次上传之前不会更改。
由于您希望文件名变量在大多数时间内映射到input$file1$name
,但在单击重置按钮时重置为NULL
,您需要创建另一个图层并维护此关系。
您可以创建变量upload_state
,使用文件上传事件将其设置为uploaded
,使用重置按钮将其设置为reset
。
根据input$file1$name
值使用反应式表达式NULL
或upload_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)
})
...