问题
Originally I create this shiny interface that takes in a parameter "company id" and "date", but here we have a problem: most people dont know the companies we work with by their id, only their name, i.e. (McDonalds, Radioshack).
So I want to ideally create a search function like this
My current idea is to pass in a table including a list of all our partner companies and their ids to global.R. Then pass in the textInput as the search variables and perform the search on server side. However, I get lost on how to pass searchResults back into the UI on a selectInput panel?
My current code:
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 is just in this format
name id
------------------
McDonalds 1
Wendy's 2
Bestbuy 3
回答1:
You need to make the UI reactive. I haven't tested this (miss data for it too) but should work I think. In server.R
add:
output$selectUI <- renderUI({
selectInput("partnerName", "Select your choice", searchResult()[,1] ),
})
And in ui.R
replace the selectInput with:
htmlOutput("selectUI")
回答2:
In Shiny version 0.8 (where I have tested it), in server.R
add the following:
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])
})
})
Now the function within shinyServer
has additional argument session
.
You can skip the label if you don't need to change it.
You don't need to change anything in ui.R
.
回答3:
Reply from Rstudio's JC:
Sure, just use a textInput for the search string, and use renderUI/uiOutput to make a dynamic selectInput. Then the rest of your code can depend on the selectInput's value. (Make sure to check for NULL or whatever when reading the selectInput value, because it will start out with no value.)
来源:https://stackoverflow.com/questions/16173325/interactively-change-the-selectinput-choices