如何在R Shiny中的“ navbarPage”菜单项之间同步“ selectizeInput”?

时间:2019-08-31 14:36:41

标签: r shiny menu navbar

让我们看一下具有'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)

谢谢!

2 个答案:

答案 0 :(得分:2)

一种方法是使用observeEvent响应输入选择中所做的更改。然后使用updateSelectizeInput更改其他输入中的选择以使其匹配。

最后一个问题是,仅添加两个observeEvent方法将无法在应用程序的初始运行中使用,因为第二页选择器的selectizeInput直到第二个{{ 1}}被选中,在这种情况下,它将调用第二页的renderUI并将所选选项设置为tabPanel(即1)。但是,将第二页初始选择的选项更改为index_selected可以解决此问题。

这是服务器代码:

input$si_page_one_selector

答案 1 :(得分:2)

我们可以创建一个全局reactiveVal,然后在用户单击si_page_one_selectorsi_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)

enter image description here

PS:此解决方案基于@Florian的答案here