2017-06-09 19 views
1

Ich habe ein Stück Code, der 20 Mal wiederholt wird, wo die gleichen Informationen, Diagramme usw. angezeigt werden, und die Anzahl der Datensätze, die angezeigt werden, hängt davon ab, wie viele Eingabefelder Benutzer wählt in einer glänzenden App aus. Anstatt diesen Code zu kopieren/einzufügen und den Eingangsnamen von "Job1" zu "Job2" im zweiten Chunk zu ändern, möchte ich eine for-Schleife einführen. Meine Frage ist, wie man eine variable Zuweisung für eine glänzende Eingabe erhält, die sequentiell ist. Ich habe paste0 ausprobiert, um zu erreichen, was ich versuche, ohne Glück.for loop shiny variable Zuweisung

Der Beispielcode zeigt meinen Versuch einer for-Schleife, das gleiche mit 4 Iterationen zu tun. Der Teil meines Versuchs, diese Arbeit zu machen, ist in der Nähe der Spitze des UI auskommentiert. Die Art, wie es jetzt funktioniert, funktioniert wie beabsichtigt, aber wie Sie sehen können, ist es nicht sauber und sehr mühsam. Auch, was würde diese aussehen wie auf der Serverseite (mein Versuch wird auch jetzt auf Kommentar)

 ui <- fluidPage(
     numericInput("num_selected", label = "Fields to Display", value = 0, min = 0, max = 4, step = 1), 


     # for (i in 1:4) { 
     #  conditionalPanel(
     #  condition = "input.num_selected >= i", 
     #  textInput(paste0("Name", i), "Name"), 
     #  textInput(paste0("Job", i), "Job") 
     #) 
     # } 



    conditionalPanel(
     condition = "input.num_selected >= 1", 
     textInput("Name1", "Name"), 
     textInput("Job1", "Job") 
    ), 



    conditionalPanel(
     condition = "input.num_selected >= 2", 
     textInput("Name2", "Name"), 
     textInput("Job2", "Job") 
    ), 


    conditionalPanel(
     condition = "input.num_selected >= 3", 
     textInput("Name3", "Name"), 
     textInput("Job3", "Job") 
    ), 


    conditionalPanel(
     condition = "input.num_selected >= 4", 
     textInput("Name4", "Name"), 
     textInput("Job4", "Job") 
    ) 
    ) 

    server<-function(input,output,session) 
    { 
     # for (i in 1:20) { 
     # output$paste0("Name", i) <- ... 
     # output$paste0("Job", i) <- ... 
      # } 
    } 

    shinyApp(ui=ui, server=server) 

Antwort

1

Sie können ein tagList() und renderUI() verwenden:

ui <- fluidPage(
    numericInput("num_selected", label = "Fields to Display", value = 0, min = 0, max = 10, step = 1), 
    uiOutput("condPanels") 
) 

server<-function(input,output,session){ 

    output$condPanels <- renderUI({ 
    # if selected value = 0 dont create a condPanel,... 
    if(!input$num_selected) return(NULL) 
    tagList(
     lapply(1:input$num_selected, function(nr){ 
     conditionalPanel(
      condition = paste0("input.num_selected >= ", nr), 
      textInput(paste0("Name", nr), "Name"), 
      textInput(paste0("Job", nr), "Job") 
     ) 
     }) 
    ) 
    }) 

} 

shinyApp(ui=ui, server=server) 
+0

Das funktioniert perfekt, aber ich fürchte, dass ich mein Problem beim Erstellen von Beispielcode zu sehr vereinfacht habe, und entschuldige mich dafür. Das Feld, das ich versuche, die Anzahl der Auswahlen zu basieren, ist ein selectInput-Feld, nicht ein numericInput, und die Felder, die angezeigt werden, sind Ausgänge anstelle von Eingängen, so habe ich das gleiche Problem mit Bezug auf die Felder zum Ausfüllen der Ausgänge in einer sich wiederholenden Weise. https://stackoverflow.com/questions/44504592/for-loop-shiny-variable-assignment-2 – User247365