【问题标题】:Use reactive expressions in renderPlot and download handler在 renderPlot 和下载处理程序中使用反应式表达式
【发布时间】:2014-06-11 20:12:36
【问题描述】:

我在renderPlot()downloadHandler() 中使用相同的反应式表达式时遇到了问题。我想使用相同的反应式表达式来减少以后的维护。我创建了两个示例,它们创建了非常简单的图形(mwe1 创建了一个可以下载的 jpeg,mwe2 没有)。我更喜欢使用创意表达的解决方案,renderPlot()downloadHander() 都可以使用,如 mwe2。有人能帮我解决这个问题吗?

提前致谢!

mwe1 <- 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(rnorm(1000, input$mean, input$sd)))

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

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

    }

)
runApp(app)
}


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(hist(rnorm(1000, input$mean, input$sd)))

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

    }

)
runApp(app)
}

【问题讨论】:

  • mwe1()mwe2() 似乎都适合我。
  • downloadHandler() 是否还会创建一个 jpeg,当您单击“下载”时,它会在闪亮的应用程序中显示绘图?对我来说,它不...
  • 没有第二个例子中的情节是空白的。
  • 没错。我正是这个意思。有没有办法通过重用反应表达式来创建非空白图?

标签: r render shiny


【解决方案1】:

mwel2 更改为:

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(hist(rnorm(1000, input$mean, input$sd)))

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

    }

  )
  runApp(app)
}

所以在.hist 对象上再次调用plot

【讨论】:

  • 谢谢!这完全符合其应有的行为。
  • 是的,这是订单问题。 renderPlot 首先调用响应式函数,因此 `downloadHandler' 需要第二次调用 plot
  • 但这不适用于用户创建的用于创建更复杂绘图的函数,请参阅编辑。
  • @tnaake 请作为新问题发布。
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多