Shiny Dynamic 选项卡依赖于其他选项卡 如何同时创建它们
Shiny Dynamic tabs dependent on other tabs How to create them simultaneously
我有一个包含汽车的选项卡,根据我选择的汽车 select 将显示年份列表(这也取决于我 select 编辑的汽车)
现在我已经创建了这个dependany
但我还有一个滑块,用于创建尽可能多的汽车标签和相关年份标签
所有选项卡都响应滑块。
但是我想成对创建它们。所以如果我在滑块 selection 中从 2 增加到 3。我想创建 3 个汽车标签以及 3 个相关年份标签
因此一对选项卡(汽车和年份)被一起创建,它们应该在彼此之下。我希望它像
cars:
Year:
cars:
Year:
现在是
cars:
cars:
Year:
Year:
非常感谢任何帮助
library(shiny)
library(shinydashboard)
ui <- dashboardPage(dashboardHeader(),
dashboardSidebar(
sliderInput("integer", "numbtabs:",min=1,max=10,value=2),
menuItem(uiOutput("select_inputs"),
uiOutput("select_inputs2"))
),dashboardBody( fluidRow(box() )))
server <- function(input, output){
observeEvent(input$integer, output$select_inputs <- renderUI({
lapply(1:input$integer, function(i){
selectInput(paste0('cars', i),
"cars:",list("Select"="","a"="mazda","b"="ford"))
})
})
)
observeEvent(input$integer, output$select_inputs2 <- renderUI({
lapply(1:input$integer, function(i){
if(input[[paste0('cars', i)]]=="mazda"){a=list("Select"="","201amazda1"="FYmazda11", "201aaa2"="FY12")}
else if(input[[paste0('cars', i)]]=="ford"){a=list("Select"="","2001"="FYFORd11", "201FORD2"="FY1200")}
selectInput(paste0('year1', i),"year:",a)
})
}))
}
shinyApp(ui = ui, server = server)
这是一个使用 shiny modules 的解决方案。基本上,您首先为单个 cars/year 选择创建一个模块,然后多次包含它。
该模块由一个 "server-part" 和一个显示两个下拉菜单的 "ui-part" 组成。根据您的示例,第二个下拉菜单的选择取决于第一个下拉菜单中的选择。
carYearUi <- function(id) {
ns <- NS(id)
wellPanel(
selectInput(
ns('cars'), "cars:", list("Select" = "", "a" = "mazda", "b" = "ford")),
uiOutput(ns('year'))
)
}
carYearServer <- function(input, output, session){
ns <- session$ns
output$year = renderUI({
if(input$cars == "mazda")
choices <- list("Select" = "","201amazda1" = "FYmazda11", "201aaa2" = "FY12")
else
choices <- list("Select" = "", "2001" = "FYFORd11", "201FORD2" = "FY1200")
selectInput(ns('year'), "year:", choices)
})
}
应用程序的其余部分创建一个滑块并使用 uiOutput
创建一个动态数量的 carYear
个实例。
library(shiny)
ui <- fluidPage(
sliderInput("slider","how much cars?", 1, 8, 1, width = "100%" ),
uiOutput("selectors")
)
server <- function(input, output, session){
# setup the servers for the modules
for(i in 1:8)
callModule(carYearServer, i)
# create dynamic ui which shows all the dropdown boxes
output$selectors <- renderUI({
lapply(1:input$slider, carYearUi)
})
}
shinyApp(ui, server)
可以通过 ID 1-cars
、1-year
、2-cars
、...、8-year
访问下拉菜单的选择。或者,您也可以使用 NS
函数来获取 ID:NS(1, "cars")
, ..., NS(8, "year")
关于跟进问题
这是在 carYearServer
函数中使用 reactiveValues
的解决方案。我还需要将一些代码从 carYearUi
移动到 carYearServer
。请注意,模块本身负责存储,因此无需更改其余代码 (ui <- ...
、server <- ...
)
library(shiny)
carYearUi <- function(id) {
ns <- NS(id)
wellPanel(
uiOutput(ns('cars')),
uiOutput(ns('year'))
)
}
carYearServer <- function(input, output, session){
ns <- session$ns
storage <- reactiveValues() ## initialize
output$year = renderUI({
if(identical(input$cars, "mazda"))
choices <- list("Select" = "","201amazda1" = "FYmazda11", "201aaa2" = "FY12")
else
choices <- list("Select" = "", "2001" = "FYFORd11", "201FORD2" = "FY1200")
selectInput(
ns('year'), "year:", choices,
selected = storage$year ## get
)
})
output$cars <- renderUI({
selectInput(
ns('cars'), "cars:", list("Select" = "", "a" = "mazda", "b" = "ford"),
selected = storage$car ## get
)
})
observe({
storage$year <- input$year ## set
storage$car <- input$cars ## set
})
}
或者,您可以使用 shiny::updateSelectInput
或 outputOptions(..., suspendWhenHidden = FALSE)
我有一个包含汽车的选项卡,根据我选择的汽车 select 将显示年份列表(这也取决于我 select 编辑的汽车)
现在我已经创建了这个dependany
但我还有一个滑块,用于创建尽可能多的汽车标签和相关年份标签
所有选项卡都响应滑块。
但是我想成对创建它们。所以如果我在滑块 selection 中从 2 增加到 3。我想创建 3 个汽车标签以及 3 个相关年份标签
因此一对选项卡(汽车和年份)被一起创建,它们应该在彼此之下。我希望它像
cars:
Year:
cars:
Year:
现在是
cars:
cars:
Year:
Year:
非常感谢任何帮助
library(shiny)
library(shinydashboard)
ui <- dashboardPage(dashboardHeader(),
dashboardSidebar(
sliderInput("integer", "numbtabs:",min=1,max=10,value=2),
menuItem(uiOutput("select_inputs"),
uiOutput("select_inputs2"))
),dashboardBody( fluidRow(box() )))
server <- function(input, output){
observeEvent(input$integer, output$select_inputs <- renderUI({
lapply(1:input$integer, function(i){
selectInput(paste0('cars', i),
"cars:",list("Select"="","a"="mazda","b"="ford"))
})
})
)
observeEvent(input$integer, output$select_inputs2 <- renderUI({
lapply(1:input$integer, function(i){
if(input[[paste0('cars', i)]]=="mazda"){a=list("Select"="","201amazda1"="FYmazda11", "201aaa2"="FY12")}
else if(input[[paste0('cars', i)]]=="ford"){a=list("Select"="","2001"="FYFORd11", "201FORD2"="FY1200")}
selectInput(paste0('year1', i),"year:",a)
})
}))
}
shinyApp(ui = ui, server = server)
这是一个使用 shiny modules 的解决方案。基本上,您首先为单个 cars/year 选择创建一个模块,然后多次包含它。
该模块由一个 "server-part" 和一个显示两个下拉菜单的 "ui-part" 组成。根据您的示例,第二个下拉菜单的选择取决于第一个下拉菜单中的选择。
carYearUi <- function(id) {
ns <- NS(id)
wellPanel(
selectInput(
ns('cars'), "cars:", list("Select" = "", "a" = "mazda", "b" = "ford")),
uiOutput(ns('year'))
)
}
carYearServer <- function(input, output, session){
ns <- session$ns
output$year = renderUI({
if(input$cars == "mazda")
choices <- list("Select" = "","201amazda1" = "FYmazda11", "201aaa2" = "FY12")
else
choices <- list("Select" = "", "2001" = "FYFORd11", "201FORD2" = "FY1200")
selectInput(ns('year'), "year:", choices)
})
}
应用程序的其余部分创建一个滑块并使用 uiOutput
创建一个动态数量的 carYear
个实例。
library(shiny)
ui <- fluidPage(
sliderInput("slider","how much cars?", 1, 8, 1, width = "100%" ),
uiOutput("selectors")
)
server <- function(input, output, session){
# setup the servers for the modules
for(i in 1:8)
callModule(carYearServer, i)
# create dynamic ui which shows all the dropdown boxes
output$selectors <- renderUI({
lapply(1:input$slider, carYearUi)
})
}
shinyApp(ui, server)
可以通过 ID 1-cars
、1-year
、2-cars
、...、8-year
访问下拉菜单的选择。或者,您也可以使用 NS
函数来获取 ID:NS(1, "cars")
, ..., NS(8, "year")
关于跟进问题
这是在 carYearServer
函数中使用 reactiveValues
的解决方案。我还需要将一些代码从 carYearUi
移动到 carYearServer
。请注意,模块本身负责存储,因此无需更改其余代码 (ui <- ...
、server <- ...
)
library(shiny)
carYearUi <- function(id) {
ns <- NS(id)
wellPanel(
uiOutput(ns('cars')),
uiOutput(ns('year'))
)
}
carYearServer <- function(input, output, session){
ns <- session$ns
storage <- reactiveValues() ## initialize
output$year = renderUI({
if(identical(input$cars, "mazda"))
choices <- list("Select" = "","201amazda1" = "FYmazda11", "201aaa2" = "FY12")
else
choices <- list("Select" = "", "2001" = "FYFORd11", "201FORD2" = "FY1200")
selectInput(
ns('year'), "year:", choices,
selected = storage$year ## get
)
})
output$cars <- renderUI({
selectInput(
ns('cars'), "cars:", list("Select" = "", "a" = "mazda", "b" = "ford"),
selected = storage$car ## get
)
})
observe({
storage$year <- input$year ## set
storage$car <- input$cars ## set
})
}
或者,您可以使用 shiny::updateSelectInput
或 outputOptions(..., suspendWhenHidden = FALSE)