我需要允许用户从一组固定的小部件中选择一些小部件,然后为他选择的每个小部件输入一个数量。
selectInput("widgets","Widgets",choices = widgets_list,multiple = TRUE)
如何动态显示一组数字输入框,一个用户在上面的多选框中选择的每个项目?
最终我想得到一些结构,如:
data.frame(widgets=c("Widget1","Widget2","Widget3"),quantities=c(23,34,23))
有关如何最好地实施此方法的任何想法?
答案 0 :(得分:1)
这是一个玩具程序,可以做你想要的 - 我想。
它使用reactiveValues
来声明一对向量,然后可以被动地更改。它使用renderUI
和uiOutput
在基础数据发生变化时呈现新的输入设备。它还使用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)