2017-10-11 4 views
0

Ich möchte die Ausgabe von der for-Schleife für viele Render-Ausgaben in Shiny App verfügbar machen. Ich habe das einfache Beispiel meines Problems erstellt. In jeder renderPrint() -Funktion gibt es dieselbe for-Schleife. Kann ich das so programmieren, dass die for-Schleife außerhalb von render *() -Funktionen verschoben wird?R Shiny: Die für viele Render-Funktionen verfügbare for-Schleife Ausgabe *() Funktionen

Ich habe Beispiele gefunden, wie Reaktive in Schleifen zu verwenden, aber keine Lösung für die umgekehrte Aufgabe gefunden haben. Vielen Dank für Ihre Hilfe und Aufmerksamkeit.

library(shiny) 

    ui <- fluidPage(sidebarLayout(
     sidebarPanel(
     numericInput(
      inputId = "seed", 
      label = "Set seed:", 
      value = 1 
     ), 
     numericInput(
      inputId = "Number", 
      label = "Number:", 
      value = 1, 
      min = 1, 
      step = 1 
     ) 
    ), 
     mainPanel(
     verbatimTextOutput("summary"), 
     dataTableOutput("table"), 
     verbatimTextOutput("data") 
    ) 
    )) 


    server <- function(input, output) { 
     a <- reactive({ 
     set.seed(input$seed) 
     rnorm(input$Number, 2, 1) 
     }) 

     b <- reactive({ 
     5 * a() 
     }) 

    rn <- reactive({ 
     c(1:input$Number) 
     }) 

     fun <- function(x, y) { 
     x + y 
     } 

     Table <- reactive({ 
     data.frame(rn = rn(), 
        a = a(), 
        b = b()) 
     }) 


     output$table <- renderDataTable({ 
     Table() 
     }) 
     output$summary <- renderPrint({ 
     for (i in Table()$rn) { 
      print (fun(Table()$a[i], Table()$b[i])) 
     } 
     }) 


     output$data <- renderPrint({ 
     for (i in Table()$rn) { 
      print (fun(Table()$a[i], Table()$b[i])) 
     } 
     }) 
    } 


    shinyApp(ui = ui, server = server) 

Antwort

1

Die for-Schleife in eine Funktion extrahieren. Sie können reaktive Werte in Funktionen ohne Probleme verwenden, solange Sie die Funktion nicht außerhalb eines reaktiven Kontexts aufrufen (render*, reactive, observe).

Beispiel:

printTable <- function() { 
    for (i in Table()$rn) { 
    print (fun(Table()$a[i], Table()$b[i])) 
    } 
} 

output$summary <- renderPrint({ 
    printTable() 
}) 

output$data <- renderPrint({ 
    printTable() 
}) 

oder effizienter, können Sie die Druckausgabe als String erfassen und einfach wieder verwenden:

capturedTableString <- reactive({ 
    capture.output({ 
    for (i in Table()$rn) { 
     print (fun(Table()$a[i], Table()$b[i])) 
    } 
    }) 
}) 

printTable <- function() { 
    cat(capturedTableString(), sep = "\n") 
} 

output$summary <- renderPrint({ 
    printTable() 
})