使用 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 或条件面板。
简洁明了的代码
在我的应用程序中,用户可以 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 或条件面板。
简洁明了的代码