我希望通过Shiny(R)捕获键值对,其中用户通过UI从已知但很大的可能选项列表中选择一些小部件(键)。
对应于每个小部件,他选择一个数字输入框,然后他可以输入一个值(数量)。
我在这里发布了一个演示:
https://statspot.shinyapps.io/app_upload_test/
为了进一步处理,最好有一个数据框,其中包含用户选择/输入的那些键值对。这是下面的红色表格。即选择了小部件的数据帧&输入相应的数量。
我的问题是我还没弄明白如何在那里动态地获取用户输入的值(我现在已将999作为静态填充虚拟值)。我可以管理的钥匙。
即。在上面的输入选择的情况下,我想要以下输出
data.frame(widgets=c("Widget B","Widget A"),quantities=c(600,400))
任何想法或指示?
我的代码在这里:
library(shiny)
widget_list<-c("WidgetA","WidgetB","WidgetC","WidgetD","WidgetE")
ui <- fluidPage(title = "Test Case for Dynamic Inputs",
headerPanel(h3("Test Case for Dynamic Inputs")),
sidebarPanel(width = 3,
selectInput("widgets","Select Widgets",choices=widget_list,multiple = TRUE)
),
sidebarPanel(title="Scoring Outputs",width = 3,
h3(textOutput("title"))
),
sidebarPanel(title="Dynamic UI",width=3,
uiOutput("widget_quantities"),
h4(tableOutput("output_table"),style="color: red")
)
)
server <- function(input, output) {
output$title<-renderText("Test dynamic inputs")
fn_run<-reactive({
count_widgets(input$widgets)
})
len_widgets<-reactive({
length(input$widgets)
})
output$output_table<-renderTable(data.frame(widgets=input$widgets,quantities=rep(999,len_widgets())))
output$widget_quantities <- renderUI({
code<-list()
for( item in input$widgets)
{
inp_name<-paste("inp",item,sep = "_")
inp_display_name<-paste("Quantity of",item,sep = " ")
code<-list(code,numericInput(inp_name, inp_display_name,value=300))
}
return(code)
})
}
count_widgets<-function(inp=c())
{
return(length(inp))
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:1)
可能你想要这个:
如果您需要任何文件让我知道,我可以稍后再添加。
library(shiny)
x <- data.frame()
widget_list = c("Widget_A","Widget_B","Widget_C","Widget_D","Widget_E")
ui <- fluidPage(title = "Test Case for Dynamic Inputs",
headerPanel(h3("Test Case for Dynamic Inputs")),
sidebarPanel(width = 3,
selectInput("widgets","Select Widgets",choices=widget_list,multiple = TRUE)
),
sidebarPanel(title="Scoring Outputs",width = 3,
h3(textOutput("title"))
),
sidebarPanel(title="Dynamic UI",width=3,
uiOutput("widget_quantities"),
h4(tableOutput("output_table"),style="color: red")
)
)
server <- function(input, output) {
global <- reactiveValues(Widget_A = 300, Widget_B = 300, Widget_C = 300, Widget_D = 300, Widget_E = 300)
output$title<-renderText("Test dynamic inputs")
fn_run<-reactive({
count_widgets(input$widgets)
})
observe({
for(item in input$widgets){
global[[item]] <- input[[paste("inp",item,sep = "_")]]
}
})
output$output_table<-renderTable({
data.frame(global$Widget_A, global$Widget_B, global$Widget_C, global$Widget_D, global$Widget_E)
})
output$widget_quantities <- renderUI({
code<-list()
for( item in input$widgets)
{
inp_name<-paste("inp",item,sep = "_")
inp_display_name<-paste("Quantity of",item,sep = " ")
code<-list(code,numericInput(inp_name, inp_display_name,value=300))
}
return(code)
})
}
count_widgets<-function(inp=c())
{
return(length(inp))
}
shinyApp(ui = ui, server = server)
答案 1 :(得分:0)
所以我还没有得到最终的解决方案,但我认为我已经发布了一些进展,我做了一个部分答案,以防它澄清了我想要做的事情。
https://statspot.shinyapps.io/app_upload_test_v2/
这个新版本现在设置了正确的数据框(因此打印出正确的表格),它从输入中动态获取值(数量)而不是之前的静态999。
output$output_table<-renderTable(data.frame(widgets=input$widgets,quantities=rep(input[["inp_WidgetA"]],len_widgets())))
唯一的缺陷就是它被硬编码以反复输入Widget A的数量。
我喜欢的是以编程方式循环,并为用户输入的任何小部件执行此操作。
想法?