使用自己的函数时,在renderPlot中使用反应式表达式并下载处理程序

时间:2014-06-11 12:14:07

标签: r render shiny

Use reactive expressions in renderPlot and download handler

我在闪亮的应用程序中使用renderPlot()downloadHandler()中的反应式表达式时遇到了问题。我想这样做是为了减少代码中的维护和冗余。

上述问题适用于“普通”绘图函数,如plot,hist等。 在我的应用程序中,我使用了一个更复杂的函数来创建一个图。我已经创建了它的简化版本

helpfunc <- function(mean, sd) {
    hist(rnorm(1000, mean, sd))
    lines(1:10)
}

如果您现在在shiny app中使用此功能,则在创建反应式表达式时它不起作用。既不使用plot()也不使用反应表达本身。

mwe <- function() {
app = list(
    ui = bootstrapPage(
         fluidPage(
            sidebarPanel(
                 sliderInput("mean", "choose mean", -10, 10, 1),
                 sliderInput("sd", "choose sd", 0, 5, 1)),
            mainPanel(
                plotOutput("hist"),
                downloadButton("histDownload")
            )
        )
        ),
server = function(input, output) {

    output$hist <- renderPlot(.hist())

    .hist <- reactive(helpfunc(input$mean, input$sd))

    output$histDownload <- downloadHandler(
        filename = function() {
            paste("hist.jpg")
        }, 
        content = function(file) {
            jpeg(file, quality = 100, width = 800, height = 800)
            .hist() ## works not for plot(.hist()) either
            dev.off()
        }
    )

}

1 个答案:

答案 0 :(得分:2)

lines基本上是对plot.xy的调用。您遇到的问题与之前的问题相同,但这次您无法分配lines的输出。和以前一样,您可以分配hist函数的输出。

helpfunc <- function(mean, sd) {
  hist = hist(rnorm(1000, mean, sd))
  myLines = function(){lines(1:10)}
  myLines()
  list(hist = hist, lines = myLines)
}

mwe2 <- function() {


  app = list(
    ui = bootstrapPage(
      fluidPage(
        sidebarPanel(
          sliderInput("mean", "choose mean", -10, 10, 1),
          sliderInput("sd", "choose sd", 0, 5, 1)),
        mainPanel(
          plotOutput("hist"),
          downloadButton("histDownload")

        )
      )
    ),
    server = function(input, output) {

      output$hist <- renderPlot(.hist())

      .hist <- reactive(helpfunc(input$mean, input$sd))

      output$histDownload <- downloadHandler(
        filename = function() {
          paste("hist.jpg")
        }, 
        content = function(file) {
          myHist <- .hist()
          jpeg(file, quality = 100, width = 800, height = 800)
          plot(myHist$hist)
          myHist$lines()
          dev.off()
        }
      )

    }

  )
  runApp(app)
}