31

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

所以我想理想地创建一个这样的搜索功能 在此处输入图像描述

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

我当前的代码:

用户界面

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]
    })

全局.R

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

合作伙伴列表就是这种格式

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

4 回答 4

31

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

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

并将ui.RselectInput 替换为:

htmlOutput("selectUI")
于 2013-04-23T16:46:54.897 回答
7

在 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.

于 2013-11-23T08:29:31.360 回答
3

来自 Rstudio 的 JC 的回复:

当然,只需使用 textInput 作为搜索字符串,并使用 renderUI/uiOutput 来制作动态 selectInput。然后你的代码的其余部分可以依赖于 selectInput 的值。(确保在读取 selectInput 值时检查 NULL 或其他内容,因为它会从没有值开始。)

于 2013-04-25T17:26:26.177 回答
0

如果我正确理解了这个问题,您需要做的就是向用户显示公司名称并将公司 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-12-16T11:10:16.433 回答