2017-10-11 4 views
0

Ce que je veux faire est de rendre la sortie de la boucle for disponible pour de nombreuses sorties de rendu dans Shiny App. J'ai créé l'exemple simple de mon problème. La boucle for est la même dans chaque fonction renderPrint(). Puis-je coder de telle sorte que la boucle for soit déplacée en dehors des fonctions render *()?R Shiny: la sortie for loop disponible pour beaucoup de fonctions render *()

J'ai trouvé des exemples d'utilisation de réactifs dans les boucles mais je n'ai pas trouvé de solution à la tâche inversée. Nous vous remercions de votre aide et de votre attention.

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) 

Répondre

1

Extraire la boucle for dans une fonction. Vous pouvez utiliser des valeurs réactives dans les fonctions sans problème, tant que vous n'appelez pas la fonction en dehors d'un contexte réactif (render*, reactive, observe).

Exemple:

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

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

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

ou plus efficacement, vous pouvez capturer la sortie d'impression sous forme de chaîne et juste réutiliser:

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() 
})