2017-02-10 3 views
0

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) 
+0

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

+0

@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

+0

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

Antwort

2

Wie ich schon in dem ersten Kommentar schrieb, ich bin nicht sicher über die Make.UI() Funktion. Wenn Sie es wirklich als separate Funktion behalten möchten, sollten Sie es reaktiv machen. Oder benutze es einfach wie im Code unten. Darüber hinaus in output$dataInfo <- renderPrint({ C ist keine reactive() Funktion, so dass Sie Klammern dort entfernen müssten.

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){ 

    K <- reactive({ 
    input$NoVars 
    }) 

    output$VarsInput <- renderUI({ 
    NoV = K() 
    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 
    }) 

    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) 
+0

Danke! Das funktioniert perfekt und es tut mir leid, dass ich Ihren ersten Kommentar nicht vollständig verstanden habe. – nzgwynn

+1

Ich habe herausgefunden, wie! Entschuldigung, ich wusste es nicht! – nzgwynn

+0

Normalerweise gebe ich keine Antworten oder Lösungen, aber für mich ist das sehr beeindruckend und ich denke @BigDataScientist verdient viel Anerkennung. –

Verwandte Themen