2016-12-27 6 views
1

Ich muss den Benutzer erlauben, einige Widgets aus einem festen Satz von Widgets auswählen und dann eine Menge für jedes Widget, das er ausgewählt hat.R-Shiny UI-Idiom für Multi-Select-Eingabe mit Zahlenpaar

selectInput("widgets","Widgets",choices = widgets_list,multiple = TRUE) 

Wie kann ich dynamisch einen Satz von numerischen Eingabefelder zeigen, eine für jedes Element durch den Benutzer in der Multi-Select-Box oben ausgewählt?

Schließlich möchte ich mit einer gewissen Struktur, um am Ende wie:

data.frame(widgets=c("Widget1","Widget2","Widget3"),quantities=c(23,34,23)) 

Irgendwelche Gedanken darüber, wie dies am besten zu implementieren?

Antwort

1

Hier ist ein Spielzeugprogramm, das tut, was Sie wollen - ich denke.

Es verwendet eine reactiveValues, um ein Paar Vektoren zu deklarieren, die Sie dann reaktiv ändern können. Es verwendet renderUI und uiOutput, um neue Eingabegeräte zu rendern, wenn sich die zugrunde liegenden Daten ändern. Es verwendet auch renderDataTable, um Ihnen die Datentabelle anzuzeigen, die erstellt wird.

library(shiny)  
widgets_list = c("Widget1","Widget2","Widget3") 
widgets_quan = c(23,34,23) 
u <- shinyUI(fluidPage(
    titlePanel("Shiny Widgets Input"), 
    sidebarLayout(position = "left", 
      sidebarPanel(h3("sidebar panel"), 
         uiOutput("widgname"), 
         uiOutput("widgquan") 
         ), 
      mainPanel(h3("main panel"), 
        dataTableOutput("dataframe") 
        ) 
))) 
s <- shinyServer(function(input,output) { 

    rv <- reactiveValues(wname = widgets_list,wquan = widgets_quan) 

    observeEvent(input$widgquan, { 
     rv$wquan[ which(rv$wname==input$widget) ] <- input$widgquan 
    }) 
    output$widgname <- renderUI({ 
    selectInput("widget","Widget",choices = rv$wname) 
    }) 
    output$widgquan <- renderUI({ 
     req(input$widget) 
     n <- rv$wquan[which(rv$wname == input$widget)] 
     numericInput("widgquan","Quantity:",n) 
    }) 
    widgdata <- reactive({ 
    req(input$widgquan) 
    df <- data.frame(Widgets = rv$wname,Quantity = rv$wquan) 
    }) 
    output$dataframe <- renderDataTable({ widgdata() }) 
}) 
shinyApp(ui = u,server = s) 

wodurch man enter image description here

+0

Dank! Vielleicht war ich nicht klar genug über meinen Anwendungsfall: Lass es mich nochmal versuchen. Es gibt eine feste große Liste aller Widgetnamen. Jeder bestimmte Benutzer möchte vielleicht zwei oder drei (oder einige) Widgets aus dieser Liste auswählen. Sobald er das tut, möchte ich eine Reihe von passenden Eingabefeldern erzeugen, die es ihm erlauben, die Mengen dieser bestimmten zwei oder drei usw. Widgetnamen einzugeben, die er ausgewählt hat. Ich glaube nicht, dass Ihre Lösung das tut, oder? –

Verwandte Themen