【发布时间】:2017-03-09 10:08:22
【问题描述】:
我有一个大型 Shiny 应用程序,它有许多提示,然后根据这些输入生成表格和绘图。我不使用 rmarkdown 或 knitr 或任何东西来格式化输出。我只使用标准的 Shiny 元素(sidebarPanel、mainPanel 等)。对于绘图和表格,我使用标准的反应式 renderPlot 和 renderTable 对象。 我正在寻找一种简单的方法来创建一个名为“导出为 PDF”的按钮,该按钮将页面上的元素导出为 PDF 文档。
我已经研究过使用 knitr 和 rmarkdown 来生成具有一些花哨格式的文档(参见 here 和 here 示例)。 问题是我似乎需要在 Rmd 文件或 downloadHandler 对象中的 server.R 中重新生成表格和绘图,我想避免这种情况。
有什么方法可以更轻松地将页面输出为 pdf。更具体地说,有什么方法可以直接从 Rmd 文件中引用输出表和绘图(即 output$ 对象),这样就不需要生成两次绘图和表。
编辑:这是一些简化的代码。注意 getDataset() 是一个响应式函数,它根据输入查询数据库。 我的目标是简单地添加一个“导出”按钮来导出已经生成的绘图和表格。 (另外作为旁注,有什么方法可以获得在所有反应元素之间共享的反应数据集?即不需要在每个对象中都有 ds
服务器
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"))
)
)
)
)
【问题讨论】:
-
我正在使用 ggplot。我将编辑帖子并放入一些示例代码
标签: r shiny knitr r-markdown