以下是一个简单的可重现的应用程序。我有两个标签。选项卡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)
```
感谢
安德鲁
答案 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")
})
享受!