动态创建和用户输入框闪亮

时间:2015-04-08 07:25:29

标签: r shiny

我正在尝试使用动态响应式UI创建一个闪亮的用户界面。

基本上,用户必须输入实验的变体数量(1-10)。

对于每个变体,用户需要在文本框中输入变体名称,并且还要按比例1 - 100分配给每个变体。所有变体的比例总和应该增加到100。

e.g。用户选择5种变体。然后,对于每个变体1-5,用户应该获得下拉选择比例。

  • 变体1比例(1-100),用户选择40说
  • 变体2比例(1-60),用户选择10个说
  • 变体3比例(1-50),用户选择35说
  • 变体4比例(1-15),用户选择10个说
  • 变体5比例(5),用户在分配时没有发言权 - 比例被退回为100 - (v1 + v2 + v3 + v4)= 5

我从这里借了代码来开始这个: Producing dynamic/multiple input boxes to collect data depending on user selection in Shiny R

ui.R

library(shiny)

shinyUI(pageWithSidebar (

  headerPanel( "Portfolio Returns"),

  sidebarPanel(
    numericInput("assets", label = "Enter Number of variants in Experiment", value="1"),
    uiOutput("variants")
  ),
  mainPanel()
))

Server.R

library(shiny)

shinyServer( function(input, output, session) {

  output$variants <- renderUI({
    numAssets <- as.integer(input$assets)

    lapply(1:numAssets, function(i) {
      list(tags$p(tags$u(h4(paste0("Variant ", i, ":")))),
           textInput(paste0("variant", i), label = "Variant Name", value = paste0("Variant ", i, " name..."))
           , numericInput(paste0("weight", i)
                          , label = "Proportion allocated (0 - 100)", value=0))
    })
  })
})

有人可以帮助解决上述问题吗?

1 个答案:

答案 0 :(得分:2)

我认为解决方案是让最终的数字输入模仿数字输入,但实际上只是一个计算输出。而不是创建与numAssets一样多的数字输入,而不是创建1。然后创建另一个看起来像其余的输出,但其值是计算而不是输入。一般来说,下面的代码可以做到这一点,但是不能很好地模仿其他数字输入的外观。此代码也可以提取from github

ui.R

library(shiny)
shinyUI(pageWithSidebar (
  headerPanel( "Portfolio Returns"),
  sidebarPanel(
    numericInput("assets", label = "Enter Number of variants in Experiment", value="3")
  ),
  mainPanel(
    uiOutput("variants"),
    uiOutput("lastVariant"))
))

server.R

library(shiny)
shinyServer( function(input, output, session) {
  output$variants <- renderUI({
    numAssets <- as.integer(input$assets)  
      lapply(1:(numAssets-1), function(i) {
        list(tags$p(tags$u(h4(paste0("Variant ", i, ":")))),
             textInput(paste0("variant", i), label = "Variant Name", value = paste0("Variant ", i, " name..."))
             , numericInput(paste0("weight", i)
                            , label = "Proportion allocated (0 - 100)", value=0)
        )
      }) #end of lapply
  }) # end of renderUI

  output$lastVariant <- renderUI({
    numAssets <- as.integer(input$assets)
    for (j in 1:(numAssets-1)){
      if(j==1){x=100}
      x = x - input[[paste0("weight",j)]]
    }
    tagList(
      tags$p(tags$u(h4(paste0("Variant ", numAssets, ":")))),
      textInput(paste0("variantFinal"), label = "Variant Name", value = paste0("Variant ", numAssets, " name...")), 
      tags$p(tags$b("Proportion allocated (0 - 100)")),
      helpText(paste0(x))
    ) #end of tagList
  }) #end of renderUI
}) #end of shinyServer