使用 rshiny 和 shinyjs() 重置 conditionalPanel fileInputs

Reset conditionalPanel fileInputs with rshiny and shinyjs()

在我的应用程序中,用户可以 select 多个会话,这决定了用户可以上传文件的文件小部件数量。

我希望发生的情况是,当用户更改会话数时(比如从 2​​ 更改为 3),条件面板中的 fileInputs 会重置,为用户再次上传文件做好准备。我一直在尝试将 shinyjs::reset() 与 observe() 结合使用来完成此操作,但它似乎不起作用,即如果用户从 2 个会话切换到 3 个会话,文件仍然存在.

下面的基本示例:

library(shiny)
library(shinyjs)

ui <- fluidPage(useShinyjs(),
                
                sidebarLayout(sidebarPanel(
                  selectInput(
                    inputId = "numSessions",
                    label = "Number of sessions",
                    choices = c("2 Sessions" = 2,
                                "3 Sessions" = 3)
                  ),
                  
                  div(
                    id = "conditional-inputs",
                    conditionalPanel(
                      "input.numSessions == 2",
                      fileInput("s1file", "Session 1"),
                      fileInput("s2file", "Session 2")
                    ),
                    
                    conditionalPanel(
                      "input.numSessions == 3",
                      fileInput("s1file", "Session 1"),
                      fileInput("s2file", "Session 2"),
                      fileInput("s3file", "Session 3")
                    )
                  )
                ),
                
              
                mainPanel()))


server <- function(input, output) {
  observe({
    if (input$numSessions == 2) {
      reset("conditional-inputs")
    } else if (input$numSessions == 3) {
      reset("conditional-inputs")
    }
  })
}


shinyApp(ui = ui, server = server)

这个怎么样:

library(shiny)

ui <- fluidPage(
    sidebarLayout(sidebarPanel(
        selectInput(
            inputId = "numSessions",
            label = "Number of sessions",
            choices = c("2 Sessions" = 2,
                        "3 Sessions" = 3)
        ),
        uiOutput("conditional-inputs")
    ),
    mainPanel()
    )
)

server <- function(input, output) {
    output$`conditional-inputs` <- renderUI({
        ui <- tagList(
            fileInput("s1file", "Session 1"),
            fileInput("s2file", "Session 2")
        )
        if(input$numSessions == 3) ui <- tagList(ui, fileInput("s3file", "Session 3"))
        ui
    })
}

shinyApp(ui = ui, server = server)

我们用renderUI刷新一下。无需使用 shinyjs 或条件面板。 简洁明了的代码