2016-12-27 106 views
1

我需要允許用戶從固定的一組小部件中選擇一些小部件,然後爲他選擇的每個小部件輸入數量。帶有數字對的多選輸入的R-Shiny UI成語

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

我怎麼能顯示動態,每一個項目的多選框以上由用戶選擇的一組數值輸入框?

最後,我想用一些結構落得這樣的:

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

就如何最好地實現這種有什麼想法?

回答

1

這是一個玩具程序,可以做你想做的 - 我想。

它使用reactiveValues來聲明一對向量,然後您可以被動地改變。它使用renderUIuiOutput隨着底層數據更改呈現新的輸入設備。它還使用renderDataTable向您顯示正在創建的數據表。

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) 

產生: enter image description here

+0

謝謝!也許我對我的用例還不夠清楚:讓我再試一次。有一個固定的大名單的所有部件名稱。任何特定的用戶可能想要從這個列表中選擇(說)兩個或三個(或某些數量)的小部件。一旦他這樣做了,我想生成一組匹配的輸入框,允許他輸入他選擇的那些特定的兩個或三個小部件名稱的數量。我認爲你的解決方案不這樣做,對吧? –