R Блестящие реактивные переключатели

#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. Именно то, что я искал!