R Shiny:可用于许多 render*() 函数的 for 循环输出

R Shiny: The for loop output available for many render*() functions

我想做的是让 for 循环的输出 运行 可用于 Shiny App 中的许多渲染输出。 我创建了我的问题的简单示例。 每个 renderPrint() 函数中都有相同的 for 循环。 我能否以将 for 循环移到 render*() 函数之外的方式进行编码?

我找到了如何在循环中使用反应式的示例,但还没有找到解决逆向任务的方法。 感谢您的帮助和关注。

    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)

将 for 循环提取到一个函数中。您可以毫无问题地在函数中使用反应值,只要您不在反应性上下文之外调用该函数(render*reactiveobserve)。

示例:

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

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

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

或者更有效,您可以将打印输出捕获为字符串并重新使用它:

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