web-dev-qa-db-fra.com

Modifier de manière interactive les choix selectInput

À l'origine, je crée cette interface brillante qui prend un paramètre "identifiant d'entreprise" et "date", mais ici nous avons un problème: la plupart des gens ne connaissent pas les entreprises avec lesquelles nous travaillons par leur identifiant, seulement leur nom, c'est-à-dire (McDonalds, Radioshack) .

Je veux donc idéalement créer une fonction de recherche comme celle-ci enter image description here

Mon idée actuelle est de passer dans un tableau comprenant une liste de toutes nos entreprises partenaires et leurs identifiants à global.R. Passez ensuite textInput comme variables de recherche et effectuez la recherche côté serveur. Cependant, je me perds sur la façon de transmettre les résultats de la recherche dans l'interface utilisateur sur un panneau selectInput?

Mon code actuel:

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 est juste dans ce format

    name            id 
 ------------------
    McDonalds        1
    Wendy's          2
    Bestbuy          3 
30
Green Demon

Vous devez rendre l'interface utilisateur réactive. Je n'ai pas testé cela (manquez de données pour cela aussi) mais devrait fonctionner je pense. Dans server.R ajouter:

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

Et en ui.R remplacez selectInput par:

htmlOutput("selectUI")
30
Sacha Epskamp

Dans la version 0.8 de Shiny (où je l'ai testé), dans server.R ajoutez ce qui suit:

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

})

Maintenant, la fonction dans shinyServer a un argument supplémentaire session.

Vous pouvez ignorer l'étiquette si vous n'avez pas besoin de la modifier.

Vous n'avez rien à changer dans ui.R.

7
Vladimir S.

Réponse du JC de Rstudio:

Bien sûr, utilisez simplement un textInput pour la chaîne de recherche et utilisez renderUI/uiOutput pour créer un selectInput dynamique. Ensuite, le reste de votre code peut dépendre de la valeur de selectInput. (Assurez-vous de vérifier NULL ou autre lors de la lecture de la valeur selectInput, car elle commencera sans valeur.)

3
Green Demon