提问人:u31889 提问时间:6/17/2020 更新时间:6/17/2020 访问量:643
闪亮的动态用户界面,带有清晰的复选框按钮
Shiny dynamic UI with clear checkbox button
问:
如何在具有动态 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
答:
0赞
Limey
6/17/2020
#1
来自以下联机帮助:任何具有 NULL 值的参数都将被忽略;它们不会导致对客户端上的输入对象进行任何更改。[我的重点。updateCheckboxGroupInput
你有。也许会给你你想要的?selected = NULL
selected=c()
编辑与我上面写的内容相矛盾,这篇文章提出了一个不同的解决方案。
编辑 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)
评论
0赞
u31889
6/17/2020
仍然没有任何事情发生,无论是否提及(相当于你提到的)。selected=c()
selected
selected = NULL
0赞
u31889
6/17/2020
使用 with 也不会触发任何内容。actionButton
if(req(input[[paste0("clear_", x)]]) > 0){...}
0赞
JohannesNE
6/17/2020
actionButton 确实会触发。但是,updateCheckboxGroupInput 不会更新任何内容。
0赞
Limey
6/17/2020
玩具示例也适用于代替 。我相信 OP 的代码中存在多个问题。selected=c()
selected=NULL
0赞
u31889
6/17/2020
我能够使按钮也适用于静态 UI。我同意,模块将有助于索引。
评论