Meine Shiny App hat mehrere Eingänge, die von der Anzahl der verwendeten Variablen abhängen. Eine vereinfachte Version, obwohl nicht funktioniert, ist unten. Ich war in der Lage, die Benutzeroberfläche auf der Grundlage der numerischen Eingabe mit einer Funktion namens Make.UI zu aktualisieren, die ich verwendet, um uiOutput machen, aber die Eingänge zurück in den Server zu bekommen ist jenseits meiner Shiny-Fähigkeiten! Irgendwelche Vorschläge würden sehr geschätzt werden.Shiny renderUI mit mehreren Eingängen
gwynn
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)
Sind Sie sicher, dass Sie 'Make.UI()' außerhalb Ihrer Serverfunktion definieren können. Es ist nicht die Ausgangsvariable verfügbar, oder? Sie müssten dafür ein glänzendes Modul verwenden. Wenn Sie mehrere Eingaben von einem renderUI zurückgeben möchten, sollten Sie eine 'tagList()' verwenden. Zu Ihrer abschließenden Frage, wie Sie die renderUI-generierte Eingabe verwenden, können Sie einfach die ID zuweisen, die Sie innerhalb des Servers zuweisen. Sollte funktionieren, sobald Sie die obigen Ausführungen berücksichtigen. – BigDataScientist
@BigDataScientist Ich habe noch nie zuvor tagList() benutzt. Kennen Sie Beispiele, die ähnlich sind? Ich habe Funktionen verwendet, die zuvor in Shiny global definiert wurden und hatte keine Probleme, aber vielleicht ist das anders. – nzgwynn
Ah ich sehe, Ihre 'Ausgabe' ist nicht die glänzende Ausgabe, aber Sie definieren es selbst, scheint, als ob ich ein bisschen müde war. Nun, ich würde stattdessen versuchen, 'output = tagList()' zu verwenden. Übrigens ist der Code nicht vollständig reproduzierbar, weil Sie nicht angegeben haben, was "l.cols" ist. Daher antworte ich allgemeiner. Hoffe es hilft trotzdem. – BigDataScientist