以交互方式更改selectInput选项

时间:2013-04-23 15:26:24

标签: r search user-interaction shiny

最初我创建了这个闪亮的界面,其中包含参数“公司ID”和“日期”,但这里我们遇到了一个问题:大多数人都不知道我们与他们合作的公司,只有他们的名字,即(麦当劳) , 窝棚电台)。

所以我想理想地创建一个像这样的搜索功能 enter image description here

我目前的想法是将包含所有合作伙伴公司及其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(),

  ),

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

4 个答案:

答案 0 :(得分:30)

您需要让UI处于反应状态。我没有测试过这个(也没有测试数据),但我认为应该可行。在server.R添加:

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

ui.R中将selectInput替换为:

htmlOutput("selectUI")

答案 1 :(得分: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中的任何内容。

答案 2 :(得分:3)

Rstudio的JC回复:

  

当然,只需使用textInput作为搜索字符串,然后使用   renderUI / uiOutput使动态selectInput。然后剩下的   您的代码可能取决于selectInput的值。 (一定要检查   读取selectInput值时为NULL或其他什么,因为它   将从没有价值开始。)

答案 3 :(得分:0)

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

我想这个功能在过去是不可用的(并且您必须按照上面的建议来解决),但是如今,selectInput函数中的参数选择恰好可以满足此需求。希望下面的示例可以澄清这种情况。

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

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

enter image description here

侧面说明:为了方便起见,我使用tibble包中的deframe函数将一个tibble转换为一个命名列表,您可以通过编写来实现此目的

.redactor_box