我正在尝试使用动态响应式UI创建一个闪亮的用户界面。
基本上,用户必须输入实验的变体数量(1-10)。
对于每个变体,用户需要在文本框中输入变体名称,并且还要按比例1 - 100分配给每个变体。所有变体的比例总和应该增加到100。
e.g。用户选择5种变体。然后,对于每个变体1-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))
})
})
})
有人可以帮助解决上述问题吗?
答案 0 :(得分:2)
我认为解决方案是让最终的数字输入模仿数字输入,但实际上只是一个计算输出。而不是创建与numAssets
一样多的数字输入,而不是创建1。然后创建另一个看起来像其余的输出,但其值是计算而不是输入。一般来说,下面的代码可以做到这一点,但是不能很好地模仿其他数字输入的外观。此代码也可以提取from github。
library(shiny)
shinyUI(pageWithSidebar (
headerPanel( "Portfolio Returns"),
sidebarPanel(
numericInput("assets", label = "Enter Number of variants in Experiment", value="3")
),
mainPanel(
uiOutput("variants"),
uiOutput("lastVariant"))
))
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