My Shiny App有多个输入,取决于所使用的变量数量。下面是一个简化版本,虽然不起作用。我能够使用一个名为Make.UI的函数来获取UI,并根据numericInput进行更新,我使用它来创建uiOutput,但将输入返回到服务器中超出了我的Shiny技能集!任何建议将不胜感激。带有多个输入的闪亮renderUI
格温
library(shiny)
D = matrix(runif(400), nrow = 20)
colnames(D) = labs = sapply(1:20, function(i) {paste0("col",i)})
# Define UI for application that summarises data
ui <- fluidPage(
# Application title
titlePanel("Summaries"),
# Select columns to get fed into summary
tabsetPanel(
tabPanel("Matching Variables Info",
sidebarPanel(
numericInput("NoVars","No. of variables to summarize",
value = 3, min = 2, max = dim(D)[2]),
uiOutput("VarsInput")
),
# Show summaries of columns choosen above
mainPanel(
verbatimTextOutput("dataInfo")
)
)
)
)
# Define the server code
server <- function(input, output){
Make.UI <- function(NoV){
C = sapply(1:NoV, function(i){paste0("cols",i)})
L = sapply(1:NoV, function(i){paste0("label",i)})
output = tagList()
for(i in seq_along(1:NoV)){
output[[i]] = tagList()
output[[i]][[1]] = selectInput(C[i], "Variable to summarize:", labs)
output[[i]][[2]] = textInput(L[i], label = "Label for variable:",
value = "Label for variable Here")
} ## for loop
output
} # closes Make.UI function
K <- reactive({
input$NoVars
})
output$VarsInput <- renderUI({
Make.UI(K())
})
output$dataInfo <- renderPrint({
C <- sapply(1:K(), function(i) {input[[paste0("cols",i)]]})
## the code in the line above doesn't work
summary(D[, C()])
})
}
# Return a Shiny app object
shinyApp(ui = ui, server = server)
您确定您可以在服务器功能之外定义'Make.UI()'。它没有可用的输出变量吗?你将不得不使用闪亮的模块。而且,如果你想从一个renderUI返回多个输入,你应该使用'tagList()'。关于如何使用renderUI生成的输入的最终问题,仅仅是通过您在服务器内分配它们的标识。只要您将上述评论考虑在内,应该尽快开展工作。 – BigDataScientist
@BigDataScientist我从来没有使用过tagList()。你知道任何与此类似的例子吗?我之前使用的是Shiny中全局定义的函数,没有任何问题,但也许这是不同的。 – nzgwynn
啊我看到了,你的'输出'不是闪亮的输出,但你自己定义它,好像我有点累。那么我会尝试使用'output = tagList()'来代替。顺便说一下,代码不是完全可重复的,因为你没有提供什么'l.cols'is。因此,我用更通用的方式回答。无论如何希望它有帮助。 – BigDataScientist