首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟downloadHandler直到生成图

延迟downloadHandler直到生成图
EN

Stack Overflow用户
提问于 2021-10-04 20:31:20
回答 1查看 57关注 0票数 1

我想要生成一个report报告使用从不同的选项卡在我的闪亮应用程序的情节。

每个选项卡中的地块只有在用户激活该选项卡后才会生成。如果以前没有激活选项卡,则小区将不存在,因此无法用于报表。

因此,在调用updateTabsetPanel之前,我尝试使用downloadHandler依次打开所有选项卡。但是,与手动单击选项卡相反,空选项卡将打开,文件下载对话框将在绘图单元开始呈现之前立即出现。只有在保存了报表文件后,才会开始呈现图表,并且报表是空的。

有没有办法强迫downloadHandler等待直到所有选项卡中的所有绘图完成呈现?

下面是一个例子:

app.R

代码语言:javascript
复制
library(shiny)
library(ggplot2)

ui <- fluidPage(
  mainPanel(
    tabsetPanel(id = "tabs",
                tabPanel("Plot1",
                         downloadButton("report", "create report"),
                         plotOutput("plot1")
                ),
                tabPanel("Plot2", plotOutput("plot2")),
                tabPanel("Plot3", plotOutput("plot3"))     
    )
  )
)
server <- function(input, output, session) {
  plots <<- list()
  
  output$plot1 <- renderPlot({
    plots[[1]] <<- ggplot(mtcars, aes(wt, mpg)) + geom_point()
    plot(plots[[1]])
  })  
  
  output$plot2 <- renderPlot({
    plots[[2]] <<- ggplot(mtcars, aes(wt, cyl)) + geom_point()
    plot(plots[[2]])
  })  
  
  output$plot3 <- renderPlot({
    plots[[3]] <<- ggplot(mtcars, aes(wt, disp)) + geom_point()
    plot(plots[[3]])
  })  
  
  
  output$report <- downloadHandler(
    filename = ("report.html"),
    content = function(file) {
      updateTabsetPanel(session, "tabs", selected = "Plot1")
      updateTabsetPanel(session, "tabs", selected = "Plot2")
      updateTabsetPanel(session, "tabs", selected = "Plot3")
      tempReport <- file.path(tempdir(), "report.rmd")
      file.copy("report.rmd", tempReport, overwrite = TRUE)
      params <- list(plots = plots)
      rmarkdown::render(tempReport, output_file = file, params = params, envir = new.env(parent = globalenv()))
    }
  )  
}

shinyApp(ui, server)

report.rmd

代码语言:javascript
复制
---
title: "report"
output: html_document
params:
  plots: NA
---

```{r}

为(我在市政厅)

代码语言:javascript
复制
plot(i)
代码语言:javascript
复制

在本例中,为了简单起见,我将tabPanel调用放在downloadHandler中。他们应该打开所有的制表符,这样情节就会呈现出来,然后,重标记就可以画出来了。

如果单击“报告”按钮,将打开第三个选项卡,并在呈现表2和表3的绘图之前显示文件对话框,因此报表只包含图1。但是,如果手动单击所有3个选项卡,然后单击“报告”,则所有绘图都将呈现并包含在报表中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-05 06:25:58

尝试:

代码语言:javascript
复制
  output$plot1 <- renderPlot({
    plots[[1]] <<- ggplot(mtcars, aes(wt, mpg)) + geom_point()
    plot(plots[[1]])
  })  
  outputOptions(output, "plot1", suspendWhenHidden = FALSE)

  output$plot2 <- renderPlot({
    plots[[2]] <<- ggplot(mtcars, aes(wt, cyl)) + geom_point()
    plot(plots[[2]])
  })  
  outputOptions(output, "plot2", suspendWhenHidden = FALSE)
  
  output$plot3 <- renderPlot({
    plots[[3]] <<- ggplot(mtcars, aes(wt, disp)) + geom_point()
    plot(plots[[3]])
  })  
  outputOptions(output, "plot3", suspendWhenHidden = FALSE)

编辑

以上内容不起作用。下面的工作。

代码语言:javascript
复制
library(shiny)
library(ggplot2)

ui <- fluidPage(
  mainPanel(
    tabsetPanel(id = "tabs",
                tabPanel("Plot1",
                         downloadButton("report", "create report"),
                         plotOutput("plot1")
                ),
                tabPanel("Plot2", plotOutput("plot2")),
                tabPanel("Plot3", plotOutput("plot3"))     
    )
  )
)
server <- function(input, output, session) {
  plots <- vector("list", length = 3L)
  
  plots[[1L]] <- reactive({
    ggplot(mtcars, aes(wt, mpg)) + geom_point()
  })
  plots[[2L]] <- reactive({
    ggplot(mtcars, aes(wt, cyl)) + geom_point()
  })
  plots[[3L]] <- reactive({
    ggplot(mtcars, aes(wt, disp)) + geom_point()
  })
  
  
  output$plot1 <- renderPlot({
    plots[[1L]]()
  })  
  
  output$plot2 <- renderPlot({
    plots[[2L]]()
  })  
  
  output$plot3 <- renderPlot({
    plots[[3L]]() 
  })  
  
  
  output$report <- downloadHandler(
    filename = "report.html",
    content = function(file) {
      tempReport <- file.path(tempdir(), "report.rmd")
      file.copy("report.rmd", tempReport, overwrite = TRUE)
      params <- list(plots = plots)
      rmarkdown::render(
        tempReport, output_file = file, params = params, 
        envir = new.env(parent = globalenv())
      )
    }
  )  
}

shinyApp(ui, server)

report.Rmd:

代码语言:javascript
复制
---
title: "report"
output: html_document
params:
  plots: NA
---

```{r}

用于(平面图中的地块)

打印(图())

代码语言:javascript
复制
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69442099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档