我有一个大型的Shiny应用程序,它有许多提示符,然后根据这些输入生成表格和绘图。我没有使用rmarkdown或knitr或任何东西来格式化输出。我只使用标准的Shiny元素(sidebarPanel
,mainPanel
,对于图和表,我使用标准的React式renderPlot
和renderTable
对象。我正在寻找一种简单的方法,有一个按钮称为“导出到PDF”将页面上的元素导出到PDF文档。
我已经研究过使用knitr和rmarkdown来生成一个格式奇特的文档(请参见here和here示例),问题是似乎需要在Rmd文件或服务器.R中的downloadHandler
对象中重新生成表和图,我希望避免这种情况。
是否有任何方法可以更容易地将页面输出为pdf。更具体地说,是否有任何方法可以直接从Rmd文件中引用输出表格和绘图(即output$
对象),以便绘图和表格不需要生成两次?
编辑:这是一些简化的代码。注意getDataset()
是一个React函数,它基于输入查询数据库。我的目标是添加一个“Export”按钮,用于导出已经生成的图和表。(另外,作为一个旁注,是否有任何方法可以获得一个在所有React元素之间共享的React数据集?也就是说,不需要在每个对象中都有ds <- getDataset()
?)
服务器
output$hist <- renderPlot({
ds <- getDataset()
# do data transformations
ggplot(ds, aes(val)) +
geom_histogram(binwidth = binSize, aes(fill = ..count..)) +
labs(title = "val dist", x = "val", y = "Count") +
scale_fill_gradient("Count", low = "green", high = "red", guide = FALSE) +
scale_x_continuous(limits = c(min(ds$val), quantile(ds$val, 0.99))) +
geom_hline(yintercept=maxY, linetype=3)
})
output$time <- renderPlot({
ds <- getDataset()
# do data transformations
ggplot(ds, aes(as.POSIXlt(unixTime, origin="1970-01-01", tz="UTC"), val), colour = val) +
scale_y_continuous(limits = c(min(ds$val), quantile(ds$val, 0.99))) +
labs(title = "Val Over Time", x = "Time (UTC)", y = "val (ms)") +
geom_point(alpha = 0.3, size = 0.7) +
geom_smooth()
})
output$stats <- renderTable({
statsDf = getDataset()
# do data transformations
statsDf
})
用户界面
ui <- fluidPage(
titlePanel("Results"),
sidebarLayout(
sidebarPanel(
dateInput("startDateTime", "Start Date:", value = "2016-10-21"),
textInput("startTime", "Start Time", "00:00:00"),
br(),
dateInput("endDateTime", "End Date:", value = "2016-10-21"),
textInput("endTime", "End Time", value = "02:00:00"),
br(),
submitButton("Submit")
),
mainPanel(
tabsetPanel(type = "tabs",
tabPanel("Plots",
plotOutput("hist"),
plotOutput("time"),
tabPanel("Statistics", tableOutput("stats"))
)
)
)
)
1条答案
按热度按时间67up9zun1#
首先,你应该真正地产生一个可复制的例子,而不仅仅是你的代码样本。我们应该复制并粘贴你的代码,它就会运行。
这个想法
1.由于您使用的是
ggplot2
,它是grid
绘图之王,我认为保存绘图/表格的一个简单的选择是使用gridExtra
包。使用grid.arrange
或arrangeGrobs
,您可以将您的grobs保存到预定义的设备。然后,downloadhandler将执行下载。1.为了避免每次都重新生成所有的图,我认为一个解决方案是将它们保存在一个全局变量中,每次更改图时都要更新该变量。这里
reactiveValues
可以用来保存图和表以及动态变量。溶液
用户界面
服务器.R