R 闪亮反应式单选按钮
R Shiny Reactive Radio Buttons
在下面的示例中,我有两个静态单选按钮代表 mtcars 和 iris 数据集。做出选择后,将根据每个数据集中的数据向用户显示第二组按钮。对于 mtcars 数据集,用户可以通过从唯一的化油器列表中进行选择来进行过滤,对于 iris 数据集,则可以选择物种。现在,我需要另一组基于 carb/species 按钮的按钮来进一步过滤数据。比如,对于 mtcars 数据集,与化油器选择相关的独特齿轮选择列表,对于 Iris 来说,是独特的一组花瓣长度。考虑到我要实现的目标在现实世界中的应用,不可避免地需要第三组反应式单选按钮。我只是不知道如何进行下一步。
ui.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())
})
}
也许这会有所帮助。您可以添加另一个 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())
})
}
在下面的示例中,我有两个静态单选按钮代表 mtcars 和 iris 数据集。做出选择后,将根据每个数据集中的数据向用户显示第二组按钮。对于 mtcars 数据集,用户可以通过从唯一的化油器列表中进行选择来进行过滤,对于 iris 数据集,则可以选择物种。现在,我需要另一组基于 carb/species 按钮的按钮来进一步过滤数据。比如,对于 mtcars 数据集,与化油器选择相关的独特齿轮选择列表,对于 Iris 来说,是独特的一组花瓣长度。考虑到我要实现的目标在现实世界中的应用,不可避免地需要第三组反应式单选按钮。我只是不知道如何进行下一步。
ui.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())
})
}
也许这会有所帮助。您可以添加另一个 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())
})
}