Я пытаюсь отобразить некоторый пользовательский интерфейс в условиях. Я хотел бы, чтобы способ выбора входных данных варьировался в зависимости от типа данных: если выбран тип Type X
, я хочу отобразить selectizeInput
, а когда выбран Type Y
, я хочу отобразить sliderInput
,Для этого я использую uiOutput
в conditionalPanel
.
Вот что я сделал до сих пор, следуя этому вопросу :
library(shiny)
library(shinyWidgets)
library(WDI)
library(DT)
library(dplyr)
foo <- data.frame(foo_name = c("A", "A", "B", "B", "C", "C"))
data <- cbind(head(mtcars), foo)
ui <- navbarPage(position = "static-top",
tabPanel(title = "Base 1",
fluidRow(
dropdownButton(
selectInput(inputId = "choice",
label = "Type of data",
choices = c("Type X",
"Type Y"),
selected = NULL,
multiple = FALSE),
conditionalPanel(
condition = "input$choice == 'Type X'",
uiOutput("machin")
),
conditionalPanel(
condition = "input$choice == 'Type Y'",
uiOutput("machin2")
),
circle = TRUE, status = "primary",
icon = icon("gear"),
width = "300px",
tooltip = tooltipOptions(title = "Outils")
),
column(width = 12,
dataTableOutput("data"))
))
)
server <- function(input, output) {
output$machin <- renderUI({
selectizeInput(inputId = "test",
label = "test",
choices = unique(data$foo_name),
selected = NULL,
multiple = T)
})
output$machin2 <- renderUI({
sliderInput("test2",
"Test2",
min = min(data$hp),
max = max(data$hp),
value = c(min(data$hp),
max(data$hp))
)
})
output$data <- renderDataTable({
if(input$choice == "Type X"){
data2 <- data %>%
filter(foo_name %in% input$test)
}
else if(input$choice == "Type Y"){
data3 <- data %>%
filter(hp %in% input$test2)
}
})
}
shinyApp(ui = ui, server = server)
Несколько проблемздесь:
- Оба типа входов отображаются независимо от того, какой тип данных выбран
- , когда выбран тип X, кадр данных пуст (так как
selectizeInput
равен NULL), но когдаТип Y выбран, некоторые значения кадра данных отображаются
Как это исправить?