在使用自己的功能时,在renderPlot和下载处理程序中使用反应表达式



shiny (1)

lines基本上是一个调用plot.xy 除了这次你不能分配行的输出外,你有和以前一样的问题。 像以前一样,您可以分配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)
}

https://src-bin.com

在renderPlot和下载处理程序中使用反应式表达式

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

上面的问题适用于“正常”情节功能,如情节,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()
        }
    )

}