这里有两种重置文件输入 UI 的方法(进度条和显示的名称)。第一个使用 JavaScript,第二个使用 renderUI。
这些示例包括一个“清除”按钮以及可选的下拉菜单,该菜单在选择更改时重置文件输入UI。
示例 1 - 使用 JavaScript
用户界面
shinyUI(bootstrapPage(
    tags$head(
        tags$style(".clearButton {float:right; font-size:12px;}")
    ),
    headerPanel("Reset file input example"),
    sidebarPanel(
        HTML("<button id='clearFile1' class='action-button clearButton'>Clear</button>"),
        fileInput('file1', NULL, width="80%"),
        selectInput('uploadFormat', label = "Select upload format", 
            choices = c(
                "Option 1" = 'f1',
                "Option 2" = 'f2',
                "Option 3" = 'f3'),
            selected = 'f1')
    ),
    mainPanel(
        h4("Summary"),
        verbatimTextOutput("summary")
    ),
    singleton(includeScript("active.js"))
))
服务器.R
shinyServer(function(input, output, session) {
    values <- reactiveValues(
        file1 = NULL
    )
    observe({
        input$clearFile1
        input$uploadFormat
        values$file1 <- NULL
    })
    observe({
        values$file1 <- input$file1
    })
    output$summary <- renderText({
        return(paste("Uploaded file: ", values$file1$name))
    })
})
主动.js
$(document).ready(function() {
    /* clear file button control */
    var fileControl = $("#file1");
    $("#clearFile1").on("click", function () {
        fileControl.replaceWith( fileControl = fileControl.clone( true ) );
        $("#file1_progress").hide();
    });
    $("#uploadFormat").on("change", function () {
        fileControl.replaceWith( fileControl = fileControl.clone( true ) );
        $("#file1_progress").hide();
    });
    /* file input progress bar control */
    $( "#file1" ).change(function() {
      document.getElementById("file1_progress").setAttribute('style', "height:20px; margin-top:5px;");
    });
});
示例 2 - 使用 renderUI
同上,但 (1) 去掉 active.js 和相关的 include 语句,(2) 在 ui.R 中替换
fileInput('file1', NULL, width="80%"),
和
uiOutput('resettableInput'),
(3) 在 server.R 中添加:
    output$resettableInput <- renderUI({
        input$clearFile1
        input$uploadFormat
        fileInput('file1', NULL, width="80%")
    })
请注意,此处可以将多个 UI 元素包含在 list() 语句中,并且它们都将被重新渲染。见这里。
您可以在此处和此处找到这些示例的代码,并像这样运行它们:
library(shiny)
shiny::runGist('0c2a98a0236f1257fd45')
shiny::runGist('bc09d77fa92457e094c8')