【发布时间】:2020-10-01 09:10:50
【问题描述】:
我正在尝试制作一个动态 UI,其中一些 tabPanel 和 checkboxGroup 是根据数据动态创建的。
下面是一个示例数据框:
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 Jhon 10.00
根据我的数据框“组”列中的唯一值,我设法创建了两个名为“A 组”和“B 组”的tabPanel。我还可以根据每个组的“名称”列的唯一值创建一个checkboxGroupInput。
但是,我不明白在哪里放置通常的服务器块以输出每个组子集的表以及框中选中的值。我看到的任何类似讨论都无法解决这种特殊情况。
请参阅下面的尝试:
library(shiny)
library(DT)
# UI
ui <- fluidPage(
mainPanel(
uiOutput('mytabs')
)
)
# SERVER
server <- function(input, output, session) {
output$mytabs <- renderUI({
Tabs_titles = unique(df$Group)
do.call(tabsetPanel,
lapply(Tabs_titles,
function(x){
tabPanel(title = x,
checkboxGroupInput(inputId = "checkboxID",
label = "My Checkbox",
choices = df %>% subset(Group == x) %>% pull(Name),
selected = df %>% subset(Group == x) %>% pull(Name)
),
DT::dataTableOutput("my_Table")
)
}
)
)
})
### Where to place this 'usual' server code below? ###
# Observe box values when changed
box_values = reactive({input$checkboxID})
# Output table
output$my_Table <- DT::renderDataTable({
subset(df, Group = <cannot catch the variable 'x' from above>, Name = box_values)
})
}
shinyApp(ui, server)
任何解释将不胜感激。
【问题讨论】:
-
我不确定我是否完全理解您想要实现的目标,但也许您可以在这里获得一些灵感:mastering-shiny.org/action-dynamic.html