【问题标题】:How to sync 'selectizeInput' between menu items for 'navbarPage' in R Shiny?如何在 R Shiny 中的“navbarPage”菜单项之间同步“selectizeInput”?
【发布时间】:2020-01-04 10:15:20
【问题描述】:

让我们看看下面的 R Shiny 仪表板代码,在主菜单中有 'navbarPage' 布局和 2 个项目“第一页”和“第二页”。每个页面都有具有相同元素(1、2、3)的选择器“Selector”。如何同步两个“selectizeInput”元素以显示相同的值存在问题。

例如,如果在“第一页”上选择“2” - 当用户转到“第二页”时,“第二页”上的选择器应该具有“2”值,反之亦然。我想可以使用 R 会话的某种全局变量。很高兴知道您的想法和代码如何有效地实施。

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)

先谢谢了!

【问题讨论】:

    标签: r shiny menu navbar


    【解决方案1】:

    我们可以创建一个全局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)
    

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

    【讨论】:

    • 谢谢。它以一种方式工作“第 2 页”=>“第 1 页”,但有时不能工作“第 1 页”=>“第 2 页”。任何想法为什么以及如何解决它?
    • 你可以在服务器端使用updateSelectizeInput 执行此操作吗?我有 50000 个基因,无法等待 ui 加载这些基因,所以我一直在从服务器端进行。
    • @BrianWiley 我认为有可能,请参阅?shiny::updateSelectizeInput 中的示例,即使用oberserve,否则发布一个新问题,将链接发布在这里,我会很高兴看到它。
    • 你知道吗,我只是想在加载大量基因方面做太多事情,在选项中使用占位符(只有在选项中的项目设置为空列表时才能这样做)以及使用分数匹配单词开头的函数。我只会让用户输入两次。
    • 我可能看到了一些东西 :) 但this 似乎对我有用。第一个答案是,Hadley's 基本上就是你的例子。
    猜你喜欢
    • 2018-10-22
    • 2020-08-03
    • 2020-08-15
    • 2019-02-11
    • 2014-11-08
    • 2023-04-06
    • 2021-10-06
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多