#r #shiny #reactive
#r #блестящие #реактивный
Вопрос:
В следующем примере у меня есть две статические переключатели, представляющие наборы данных mtcars и iris. После выбора пользователю предоставляется второй набор кнопок на основе данных в каждом наборе данных. Для набора данных mtcars пользователь может выполнить фильтрацию, выбрав из уникального списка карбюраторов или, в случае набора данных iris, вид. Теперь мне нужен другой набор кнопок на основе кнопок carb / species для дальнейшей фильтрации данных. Скажем, для набора данных mtcars список уникальных вариантов выбора передач связан с выбором карбюратора, а для диафрагмы — уникальный набор длин лепестков. Учитывая реальное применение того, чего я пытаюсь достичь, невозможно избежать необходимости использования третьего набора реактивных переключателей. Я просто понятия не имею, как подойти к следующему шагу.
Пользовательский интерфейс.R
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(title = "My DFS Dashboard"),
dashboardSidebar(
sidebarMenu(
menuItem("MTCARS", tabName = "dashboard", icon = icon("dashboard")),
menuItem("IRIS", tabName = "widgets", icon = icon("th"))
)
),
dashboardBody(
fluidRow (
column(width = 3,
box(title = "Select Dataset", width = NULL, status = "primary", background = "aqua",
radioButtons ("mydataset",
"",
inline = TRUE,
c("mtcars", "iris"),
selected = "mtcars"))),
column(width = 3,
box(title="Select Filter One", width = NULL, status = "primary", background = "aqua",
uiOutput("filter1"))),
column(width = 3,
box(title = "Select Fitler Two", width = NULL, status = "primary", background = "aqua",
uiOutput("filter2")))
)
)
)
server.R
library(tidyverse)
server <- function(input, output, session) {
data("mtcars")
data("iris")
cars <- mtcars
flowers <- iris
carbs <- cars %>%
dplyr::select(carb)
carbs <- carbs$carb
carbs <- as.data.frame(carbs)
carbs <- unique(carbs$carb)
spec <- flowers %>%
dplyr::select(Species)
spec <- unique(spec$Species)
vards <- reactive ({
switch(input$mydataset,
"mtcars" = carbs,
"iris" = spec,
)
})
output$filter1 <- renderUI({
radioButtons("fil1","", choices=vards())
})
}
Ответ №1:
Возможно, это может быть полезно. Вы можете добавить другое reactive
выражение для фильтрации вашего набора данных и получения вариантов выбора для третьего набора переключателей. Я включил isolate
так, чтобы третий набор кнопок не реагировал на изменения в наборе данных (только изменения во вторых переключателях, которые уже зависят от набора данных). Пожалуйста, дайте мне знать, если это то, что вы имели в виду для поведения.
server <- function(input, output, session) {
data("mtcars")
data("iris")
cars <- mtcars
flowers <- iris
vards1 <- reactive({
switch(input$mydataset,
"mtcars" = unique(cars$carb),
"iris" = unique(flowers$Species),
)
})
vards2 <- reactive({
req(input$fil1)
if (isolate(input$mydataset) == "mtcars") {
cars %>%
filter(carb == input$fil1) %>%
pull(gear) %>%
unique()
} else {
flowers %>%
filter(Species == input$fil1) %>%
pull(Petal.Length) %>%
unique()
}
})
output$filter1 <- renderUI({
radioButtons("fil1","", choices=vards1())
})
output$filter2 <- renderUI({
radioButtons("fil2","", choices=vards2())
})
}
Комментарии:
1. Именно то, что я искал!