【发布时间】:2021-12-05 02:44:42
【问题描述】:
我一直在尝试创建一个最多包含 3 个输入的仪表板,然后绘制一些数据。我已经完成了这部分,但现在的要求已经改变,每次选择一个新变量时,他们也应该能够根据新输入过滤数据。到目前为止,这是我的尝试:
用户界面:
library(shiny)
ui <- fluidPage(
sidebarPanel(
tags$br(),
uiOutput("textbox_ui"),
uiOutput("filter_ui"),
tags$br(),
actionButton("add_btn", "Add Factor"),
actionButton("rm_btn", "Remove Factor"),
tags$br(),
actionButton("make","Create Graph and Tables")
),
mainPanel(
tabsetPanel(type = "tabs",
tabPanel("Data stuff")
)
)
)
服务器:
server <- function(input, output) {
# Track the number of input boxes to render
counter <- reactiveValues(n = 0)
AllInputs <- reactive({
x <- reactiveValuesToList(input)
})
observeEvent(input$add_btn, {
if(counter$n >2){
2
}else{
counter$n <- counter$n + 1
}
})
observeEvent(input$rm_btn, {
if (counter$n > 0) counter$n <- counter$n - 1
})
textboxes <- reactive({
n <- counter$n
if (n > 0) {
isolate({
lapply(seq_len(n), function(i) {
selectInput(inputId = paste0("var", i+1),
label = "",
choices = colnames(mtcars),
selected = AllInputs()[[paste0("var", i+1)]])
})
})
}
})
filterboxes <- reactive({
n <- counter$n
extrainputs <- sapply(seq_len(n), function(i) {
AllInputs()[[paste0("var", i+1)]]
})
summvar <- c(input$var1, extrainputs)
if(n > 0 ){
isolate({
lapply(1:length(summvar), function(x){
text <- summvar[x]
val_level <- unique(mtcars[[text]])
selectInput(inputId = paste0("fil",x+1),
label = paste0("Filter for ", text),
choices = val_level,
multiple = TRUE,
selected = val_level)
})
})
}
})
output$textbox_ui <- renderUI({ textboxes() })
output$filter_ui <- renderUI({ filterboxes() })
}
到目前为止,此设置存在两个问题。一个当它们出现在过滤器中时,我无法取消选择任何值第二个我在服务器端看到此警告“警告:.subset2 中的错误:无效的下标类型'列表'”。我的反应能力很差,任何建议(无论是否反应)都将不胜感激。
【问题讨论】:
-
您正在重复使用相同的 ID,因此它不起作用。一种方法是使用
insertUI选择新变量,使用removeUI将其删除。此外,您需要使用updateSelelctInput更新observeEvent中第二个selectInput的选择,以便第一个SelectInput中的第一个变量选择。 -
非常感谢您的建议。我目前(不理想)的解决方法是编写一大堆
conditionalPanels 并且有效。您能否编写一个您建议的示例,我无法完全理解它。