【问题标题】:Interactively change the selectInput choices以交互方式更改 selectInput 选项
【发布时间】:2013-04-16 21:39:25
【问题描述】:

最初我创建了这个带有参数“company id”和“date”的闪亮界面,但这里我们有一个问题:大多数人不知道他们的 id 与我们合作的公司,只知道他们的名字,即(McDonalds , 窝棚电台)。

所以我想理想地创建一个这样的搜索功能

我目前的想法是将包含我们所有合作伙伴公司的列表及其 ID 的表格传递给 global.R。然后传入 textInput 作为搜索变量并在服务器端执行搜索。但是,我迷失了如何将 searchResults 传递回 selectInput 面板上的 UI?

我当前的代码:

ui.R

library(shiny)

shinyUI(pageWithSidebar(


  sidebarPanel(

    textInput("nameSearch", "Or, Search for company name", 'McDonald'),
    selectInput("partnerName", "Select your choice", list( "searchResults" ),
    br(),
    submitButton("Update View"),
    br(),

  ),

服务器.R

  shinyServer(function(input, output) {

  #subTable
  searchResult<- reactive({
    subset(partners, grepl(input$nameSearch, partners$name))
  })

  output$searchResults <- renderTable({ 
    searchResult[,1]
    })

global.R

partners<- read.csv("partnersList.csv", fill=TRUE)

partnersList 就是这种格式

    name            id 
 ------------------
    McDonalds        1
    Wendy's          2
    Bestbuy          3 

【问题讨论】:

    标签: r search user-interaction shiny


    【解决方案1】:

    您需要使 UI 具有响应性。我还没有测试过这个(也错过了数据),但我认为应该可以工作。在server.R 添加:

    output$selectUI <- renderUI({ 
    selectInput("partnerName", "Select your choice", searchResult()[,1] ),
    })
    

    ui.R 中将 selectInput 替换为:

    htmlOutput("selectUI")
    

    【讨论】:

    • 我已经成功了。这是我没有尝试过的替代方法:groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/…
    • 感谢 Sacha 这对我有用。 GSee:新的发展将是惊人的!
    • 这在 R Markdown 中不起作用。关于如何在 R Markdown 中执行此操作的任何想法?
    • 所以我的问题是它在一开始是不可见的。如何让整个列表从一开始就可见,然后使用搜索栏清除结果?
    • 注意通过input$partnerName可以正常访问值
    【解决方案2】:

    在 Shiny 0.8 版(我已经测试过)中,在 server.R 添加以下内容:

    shinyServer(function(input, output, session) {
    
      observe({
        # This will change the value of input$partnerName to searchResult()[,1]
        updateTextInput(session, "partnerName", 
                        label = "Select your choice", 
                        value = searchResult()[,1])
      })
    
    })
    

    现在shinyServer 中的函数有额外的参数session

    如果您不需要更改标签,您可以跳过它。

    您无需更改 ui.R 中的任何内容。

    【讨论】:

    • 这是最新版shiny的最佳解决方案
    【解决方案3】:

    来自 Rstudio 的 JC 的回复:

    当然,只需使用 textInput 作为搜索字符串,然后使用 renderUI/uiOutput 来做一个动态的 selectInput。然后剩下的 您的代码可能取决于 selectInput 的值。 (请务必检查 对于 NULL 或读取 selectInput 值时的任何内容,因为它 开始时没有任何价值。)

    【讨论】:

      【解决方案4】:

      如果我正确理解了这个问题,您需要做的就是向用户显示公司名称并将公司ID传递给服务器。

      我想这个功能在过去是不可用的(你必须按照上面的建议解决)但是现在 selectInput 函数中的参数选择完全接受命名列表来满足这个需要。希望下面的示例可以说明情况。

      library(shiny)
      library(tidyverse)
      
      companies <- tribble(
          ~name, ~id,
          "McDonalds", 1,
          "Wendy's", 2,
          "Bestbuy", 3
      )
      
      ui <- fluidPage(
          uiOutput("select_company_ui"),
          textOutput("value")
      )
      
      server <- function(input, output) {
          output$select_company_ui <- renderUI({
              selectInput("select_company", "Select company", choices = deframe(companies))
          })
          
          output$value <- renderText(paste0("Value of the company filter is ", input$select_company))
      }
      
      # Run the application 
      shinyApp(ui = ui, server = server)
      

      在这里您可以看到生成的应用程序:

      旁注:为了方便起见,我使用包 tibble 中的函数 deframe 将 tibble 转换为命名列表,您可以通过编写来做到这一点

      choices = c("McDonalds" = 1, "Wendy's" = 2, "Bestbuy" = 3)
      

      【讨论】:

        猜你喜欢
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2021-07-12
        • 1970-01-01
        • 2020-11-13
        • 2011-06-16
        • 2019-12-25
        相关资源
        最近更新 更多