2013-04-23 12 views
29

Oryginalnie tworzę ten błyszczący interfejs, który przyjmuje parametr "id firmy" i "date", ale tutaj mamy problem: większość ludzi nie zna firm, z którymi pracujemy według ich id, tylko ich nazwa, tj. (McDonalds, Radioshack).Interaktywnie zmień wybory selectInput

Więc chcę idealnie utworzyć funkcję przeszukiwania jak ten enter image description here

Mój obecny pomysł jest do przekazania w formie tabeli wraz z listą wszystkich naszych firm partnerskich i ich identyfikatory global.R. Następnie wpisz textInput jako zmienne wyszukiwania i przeprowadź wyszukiwanie po stronie serwera. Jednak zagubiłem się, jak przekazać searchResults z powrotem do interfejsu użytkownika w panelu selectInput?

Mój bieżący kod:

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 jest właśnie w tym formacie

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

Odpowiedz

29

Musisz ustawić interfejs użytkownika jako reaktywny. Nie testowałem tego (brakuje danych również), ale powinno działać, jak sądzę. W server.R dodają:

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

I ui.R wymienić selectInput z:

htmlOutput("selectUI") 
+0

Odniosłem sukces z tym. Oto alternatywa, której jeszcze nie wypróbowałem: https://groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/JGJx5A3Ge-A – GSee

+0

dzięki Sacha to zadziałało dla mnie. GSee: ten nowy rozwój będzie niesamowity !! –

+1

To nie działa w R Markdown. Wszelkie pomysły, jak to zrobić w R Markdown? – NewNameStat

3

Odpowiedz z Rstudio JC:

Jasne, wystarczy użyć textInput do łańcucha wyszukiwania i wykorzystania renderUI/uiOutput, aby dokonać dynamicznego selectInput. Wtedy reszta kodu może zależeć od wartości selectInput. (Upewnij się, aby sprawdzić dla NULL lub cokolwiek podczas odczytu wartości selectInput, ponieważ będzie to rozpocząć się bez wartości.)

6

błyszczące wersji 0.8 (gdzie ja testowałem go), w server.R dodać następujące :

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

}) 

teraz funkcja ciągu shinyServer ma dodatkowy argument session.

Możesz pominąć etykietę, jeśli nie musisz jej zmieniać.

Nie musisz niczego zmieniać w ui.R.

Powiązane problemy