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

时间:2017-10-11 16:46:35

标签: r for-loop shiny shiny-reactivity

我想要做的是让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)

1 个答案:

答案 0 :(得分:1)

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