2016-12-27 108 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

谢谢!也许我对我的用例还不够清楚:让我再试一次。有一个固定的大名单的所有部件名称。任何特定的用户可能想要从这个列表中选择(说)两个或三个(或某些数量)的小部件。一旦他这样做了,我想生成一组匹配的输入框,允许他输入他选择的那些特定的两个或三个小部件名称的数量。我认为你的解决方案不这样做,对吧? –