让我们看一下具有'navbarPage'布局的R Shiny仪表板的以下代码,并在主菜单中包含2个项目“ Page 1”和“ Page 2”。每个页面的选择器“选择器”具有相同的元素(1、2、3)。如何同步两个'selectizeInput'元素以显示相同的值存在问题。
例如,如果在“第一页”上选择“ 2”,则当用户转到“第二页”时,“第二页”上的选择器应具有“ 2”值,反之亦然。我猜想可以为R会话使用某种globall变量。很高兴知道您的想法并编写代码以有效地实现它。
library(shiny)
server <- function(input, output, session) {
# 1. Selector for 'Page one'
output$uo_page_one_selector <- renderUI({
# 1. Values
list_values <- c(1:3)
names(list_values) <- c("One", "Two", "Three")
# 2. Index of selected element
index_selected <- 1
# 3. Result
selectizeInput('si_page_one_selector', "Selector",
choices = list_values, multiple = FALSE,
selected = list_values[index_selected])
})
# 2. Selector for 'Page two'
output$uo_page_two_selector <- renderUI({
# 1. Values
list_values <- c(1:3)
names(list_values) <- c("One", "Two", "Three")
# 2. Index of selected element
index_selected <- 1
# 3. Result
selectizeInput('si_page_two_selector', "Selector",
choices = list_values,
multiple = FALSE,
selected = list_values[index_selected])
})
}
ui <- fluidPage(
navbarPage("Demo",
tabPanel("One",
fluidPage(
fluidRow(uiOutput("uo_page_one_selector")),
fluidRow("Page one"))),
tabPanel("Two",
fluidPage(
fluidRow(uiOutput("uo_page_two_selector")),
fluidRow("Page two")))
)
)
# Run the application
shinyApp(ui, server)
谢谢!
答案 0 :(得分:2)
一种方法是使用observeEvent
响应输入选择中所做的更改。然后使用updateSelectizeInput
更改其他输入中的选择以使其匹配。
最后一个问题是,仅添加两个observeEvent
方法将无法在应用程序的初始运行中使用,因为第二页选择器的selectizeInput
直到第二个{{ 1}}被选中,在这种情况下,它将调用第二页的renderUI并将所选选项设置为tabPanel
(即1)。但是,将第二页初始选择的选项更改为index_selected
可以解决此问题。
这是服务器代码:
input$si_page_one_selector
答案 1 :(得分:2)
我们可以创建一个全局reactiveVal
,然后在用户单击si_page_one_selector
或si_page_two_selector
时对其进行更新
library(shiny)
server <- function(input, output, session) {
list_values <- c(1:3)
names(list_values) <- c("One", "Two", "Three")
rv = reactiveVal(1)
observeEvent(input$si_page_one_selector,{
tmp = rv() # Read reactiveVal
tmp = input$si_page_one_selector
rv(tmp) # set reactiveVal to new value
})
observeEvent(input$si_page_two_selector,{
tmp = rv()
tmp = input$si_page_two_selector
rv(tmp)
})
# 1. Selector for 'Page one'
output$uo_page_one_selector <- renderUI({
# 3. Result
selectizeInput('si_page_one_selector', "Selector",
choices = list_values, multiple = FALSE,
selected = list_values[as.numeric(rv())])
})
# 2. Selector for 'Page two'
output$uo_page_two_selector <- renderUI({
# 3. Result
selectizeInput('si_page_two_selector', "Selector",
choices = list_values,
multiple = FALSE,
selected = list_values[as.numeric(rv())])
})
}
ui <- fluidPage(
navbarPage("Demo",
tabPanel("One",
fluidPage(
fluidRow(uiOutput("uo_page_one_selector")),
fluidRow("Page one"))),
tabPanel("Two",
fluidPage(
fluidRow(uiOutput("uo_page_two_selector")),
fluidRow("Page two")))
)
)
# Run the application
shinyApp(ui, server)
PS:此解决方案基于@Florian的答案here