使用R Shiny

时间:2017-01-16 13:02:54

标签: r user-interface shiny

我希望通过Shiny(R)捕获键值对,其中用户通过UI从已知但很大的可能选项列表中选择一些小部件(键)。

对应于每个小部件,他选择一个数字输入框,然后他可以输入一个值(数量)。

我在这里发布了一个演示:

https://statspot.shinyapps.io/app_upload_test/

enter image description here

为了进一步处理,最好有一个数据框,其中包含用户选择/输入的那些键值对。这是下面的红色表格。即选择了小部件的数据帧&输入相应的数量。

我的问题是我还没弄明白如何在那里动态地获取用户输入的值(我现在已将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)

2 个答案:

答案 0 :(得分:1)

可能你想要这个:

  • 你可以让它更干净而不是硬编码所有的小部件,但我认为你可以从这里改编它
  • 当您更新小部件时,数量也将重置,但我的午餐时间结束了:D让我知道如果您能解决这个问题,应该回答基本问题。

如果您需要任何文件让我知道,我可以稍后再添加。

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/

enter image description here

这个新版本现在设置了正确的数据框(因此打印出正确的表格),它从输入中动态获取值(数量)而不是之前的静态999。

  output$output_table<-renderTable(data.frame(widgets=input$widgets,quantities=rep(input[["inp_WidgetA"]],len_widgets())))

唯一的缺陷就是它被硬编码以反复输入Widget A的数量。

我喜欢的是以编程方式循环,并为用户输入的任何小部件执行此操作。

想法?