具有数字对的多选输入的R-Shiny UI惯用语

时间:2016-12-27 16:20:54

标签: r shiny

我需要允许用户从一组固定的小部件中选择一些小部件,然后为他选择的每个小部件输入一个数量。

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

如何动态显示一组数字输入框,一个用户在上面的多选框中选择的每个项目?

最终我想得到一些结构,如:

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

有关如何最好地实施此方法的任何想法?

1 个答案:

答案 0 :(得分: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