加载闪亮应用时预加载所有标签

时间:2017-08-29 21:54:02

标签: r tabs shiny r-markdown

以下是一个简单的可重现的应用程序。我有两个标签。选项卡1显示图表,而选项卡2显示图表和表格。

我还在侧栏中有一个下载按钮和一个Rmd文档。

问题是,我想要下载的html页面失败,除非我选择Tab 2.当我选择Tab 2时,即使我在下载之前返回到Tab 1,下载也能正常工作。显然,这部分是由于表2中的反应元素。

但是,无论我是否访问选项卡2,我都希望下载能够正常工作。换句话说,当应用程序加载时,我只需单击下载按钮,生成的html页面将包含两个选项卡中的图表和表格。 / p>

有没有办法预加载Tab 2?正如您所看到的,我已经尝试使用suspendWhenHidden = FALSE的outputOptions函数,但它看起来没有用。

请帮忙吗?

闪亮:

library(shiny)
library(rmarkdown)


data(mtcars)


ui <- fluidPage(
  titlePanel("Preload Plots"),

  sidebarPanel(
    uiOutput("down")
  ),


  mainPanel(
    fluidRow(
      tabsetPanel(
        tabPanel("Panel 1",
                 plotOutput("plot1")
                 ),
        tabPanel("Panel 2",
                 uiOutput("selectList"),
                 plotOutput("plot2"),
                 tableOutput("tbl")
                 )
      )
    )
  )
)


server <- function(input, output){


  output$plot1 <- renderPlot({
    barplot(mtcars$cyl)
    })


  output$selectList <- renderUI({
    selectInput("selectionBox", "Select Cyl Size", unique(mtcars$cyl), selected = 4)
  })

  cylFun <- reactive(
     mtcars[mtcars$cyl == input$selectionBox, c("mpg", "wt")]
  )

  output$plot2 <- renderPlot({
    plot(cylFun())
    })

  outputOptions(output, "plot2", suspendWhenHidden = FALSE)


  output$tbl <- renderTable(
    table(cylFun())
  )

  outputOptions(output, "tbl", suspendWhenHidden = FALSE)

  output$down <- renderUI({
    downloadButton("downloadPlots", "Download Plots")
  })

  output$downloadPlots <- downloadHandler(
    filename = "plots.html",

    content = function(file){
      params = list(p2 = cylFun())
      render("plots.Rmd", html_document(), output_file = file)
    }
  )

}


shinyApp(ui, server

Rmarkdown:

---
title: "plots"
output: html_document
---

```{r, echo = FALSE}

barplot(mtcars$cyl)

```

```{r, echo = FALSE}

plot(params$p2)
knitr::kable(params$p2)

```

感谢
安德鲁

2 个答案:

答案 0 :(得分:0)

你有正确的想法,suspendWhenHidden似乎是关键。问题是Rmd渲染需要cylFun才能有值,cylFun取决于您使用selectionBox创建的renderUI输入值。您有情节和表格的suspendWhenHidden选项,但如果没有selectionBox则无法计算这些选项,并且没有它们时可以使用降价。

所以只需添加

  outputOptions(output, "selectList", suspendWhenHidden = FALSE)

它应该有效。您还可以删除表格的outputOptions并在标签2上绘图。

答案 1 :(得分:0)

使用downloadButton renderUI轻松加载所有标签的黑客。 使用 req 关键字,如下所示。这将加载所有输出,所有选项卡都将加载然后出现。

 output$down <- renderUI({
    req(plot1,selectList,plot2,tbl)
    downloadButton("downloadPlots", "Download Plots")
  })

享受!