【问题标题】:Shiny dynamic UI with clear checkbox button带有清晰复选框按钮的闪亮动态 UI
【发布时间】:2020-06-17 12:36:57
【问题描述】:

如何在具有动态 UI 的应用中添加“清除”按钮以将复选框值重置为 NULL?

示例数据:

df <- data.frame(
  "Group" = c("Group A", "Group B", "Group A", "Group A", "Group B"),
  "Name" = c("Bob", "Paul", "Peter", "Emma", "John"),
  "Value" = seq(1,10, length.out=5),
  stringsAsFactors = F
)

df
    Group  Name Value
1 Group A   Bob  1.00
2 Group B  Paul  3.25
3 Group A Peter  5.50
4 Group A  Emma  7.75
5 Group B  John 10.00

我为每个 Group 创建一个标签和一个 Name 值的复选框:

library(shiny)

# UI
ui <- fluidPage(
  mainPanel(
    uiOutput('mytabs')
  )
)

# SERVER
server <- function(input, output, session) {

  Tabs_titles = unique(df$Group)

  # Dynamic UI
  output$mytabs <- renderUI({
    myTabs <- lapply(Tabs_titles,
                     function(x){
                       tabPanel(title = x,
                                checkboxGroupInput(inputId = paste0("checkboxID_", x),
                                                   label = "My Checkbox",
                                                   choices = df %>% subset(Group == x) %>% pull(Name),
                                                   selected = df %>% subset(Group == x) %>% pull(Name)
                                ),
                                checkboxInput(paste0("clear_", x), "Clear"),
                                tableOutput(paste0("my_Table_", x))
                       )
                     }
    )

    do.call(tabsetPanel, myTabs)

  })


  observe(
    lapply(Tabs_titles,
           function(x){
             checked_names <- reactive({input[[paste0("checkboxID_", x)]]})

             # Table
             output[[paste0("my_Table_", x)]] <-renderTable({
               df %>%
               subset(Group == x & Name %in% checked_names())
             })

             # Clear button here
             observe({
               if(req(input[[paste0("clear_", x)]]) == TRUE){
                 updateCheckboxGroupInput(
                  session,
                  paste0("checkboxID_", x),
                  choices = df %>% subset(Group == x) %>% pull(Name),
                  selected = NULL
                )
               }
             })
           }
    )
  )
}


shinyApp(ui, server)

但检查后,Clear框不会触发任何东西。

【问题讨论】:

  • 你不使用模块有什么原因吗?
  • 没错,模块可能更适合这种情况。

标签: r shiny dynamic-ui


【解决方案1】:

来自updateCheckboxGroupInput 的在线帮助:任何具有 NULL 值的参数都将被忽略; 它们不会导致客户端上的输入对象发生任何变化。 [我的重点。]

你有selected = NULL。也许selected=c()会给你你想要的?

编辑 与我上面写的相反,this post 提出了不同的解决方案。

编辑 2 这个概念验证示例按预期工作。因此,您的代码中可能存在与工作解决方案交互的第二个问题。正如我之前可能提到的:使用模块会让您的生活更轻松:每个模块都将负责清除自己的checkboxGroupInput,因此索引不会成为问题。

library(shiny)

ui <- fluidPage(
   titlePanel("Clear checkboxGroup Test"),
   sidebarLayout(
      sidebarPanel(
        actionButton("clear", "Clear")
      ),
      mainPanel(
        checkboxGroupInput("group", "The Beatles", choices=c("John", "Paul", "George", "Ringo"))
      )
   )
)

server <- function(input, output, session) {
  observeEvent(input$clear, {
    updateCheckboxGroupInput(session, "group", choices=c("John", "Paul", "George", "Ringo"), selected=NULL)
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • selected=c() 或根本没有提及 selected 仍然没有发生任何事情(相当于您提到的 selected = NULL)。
  • 将actionButton 与if(req(input[[paste0("clear_", x)]]) &gt; 0){...} 一起使用也不会触发任何事情。
  • actionButton 会触发。但是,updateCheckboxGroupInput 不会更新任何内容。
  • 玩具示例也可以使用selected=c() 代替selected=NULL。我相信 OP 的代码中存在不止一个问题。
  • 我可以让按钮也适用于静态 UI。我同意,这些模块将有助于索引。
猜你喜欢
  • 2019-07-23
  • 2017-09-10
  • 1970-01-01
  • 2019-08-02
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多