我正在试图弄清楚如何使用downloadButton来保存闪亮的情节 . 包中的示例演示了downloadButton / downloadHandler以保存.csv . 我将基于此创建一个可重现的示例 .
对于 ui.R
shinyUI(pageWithSidebar(
headerPanel('Downloading Data'),
sidebarPanel(
selectInput("dataset", "Choose a dataset:",
choices = c("rock", "pressure", "cars")),
downloadButton('downloadData', 'Download Data'),
downloadButton('downloadPlot', 'Download Plot')
),
mainPanel(
plotOutput('plot')
)
))
对于 server.R
library(ggplot2)
shinyServer(function(input, output) {
datasetInput <- reactive({
switch(input$dataset,
"rock" = rock,
"pressure" = pressure,
"cars" = cars)
})
plotInput <- reactive({
df <- datasetInput()
p <-ggplot(df, aes_string(x=names(df)[1], y=names(df)[2])) +
geom_point()
})
output$plot <- renderPlot({
print(plotInput())
})
output$downloadData <- downloadHandler(
filename = function() { paste(input$dataset, '.csv', sep='') },
content = function(file) {
write.csv(datatasetInput(), file)
}
)
output$downloadPlot <- downloadHandler(
filename = function() { paste(input$dataset, '.png', sep='') },
content = function(file) {
ggsave(file,plotInput())
}
)
})
如果您正在回答这个问题,那么您可能对此很熟悉,但为了使其正常工作,请将上述内容保存到单独的脚本中( ui.R
和 server.R
到工作目录中的文件夹( foo
) . 要运行闪亮的应用程序,请运行 runApp("foo")
.
使用 ggsave
,我收到一条错误消息,指出ggsave无法使用 filename
函数(我认为) . 如果我使用标准图形设备(如下所示), Download Plot
可以正常工作,但它不会写入图形 .
任何提示下载处理程序工作用于编写图表的任何提示将不胜感激 .
4 回答
这是旧的,但当有人谷歌“R闪亮保存ggplot”时仍然是最受欢迎的,所以我将贡献另一种解决方法 . 非常简单...在显示图形的同一函数中调用ggsave,这将把图形保存为服务器上的文件 .
然后,使用downloadHandler并使用
file.copy()
将现有文件中的数据写入"file"参数 .适合我 .
不确定这个问题是否仍然有效,但它是第一个在搜索“在闪亮的应用程序中保存情节”时出现的问题,因此我想快速添加如何让ggsave与原始问题的行一起使用downloadHandler .
juba提出的替代策略使用直接输出而不是ggsave和alexwhan自己建议的替代策略都很有效,这只适用于那些绝对想在downloadHandler中使用ggsave的人 .
alexwhan报告的问题是由ggsave尝试将文件扩展名与正确的图形设备匹配引起的 . 但是,临时文件没有扩展名,因此匹配失败 . 这可以通过在
ggsave
函数调用中专门设置设备来解决,就像在原始代码示例中一样(对于png):此调用基本上采用
device
函数为png
内部ggsave
分配(您可以查看ggsave
函数代码以查看jpg
,pdf
等的语法) . 理想情况下,可以指定文件扩展名(如果与文件名不同 - 就像临时文件的情况一样)作为ggsave
参数,但此选项目前在ggsave
中不可用 .一个最小的独立工作示例:
更新
从ggplot2版本2.0.0开始,
ggsave
函数支持device
参数的字符输入,这意味着现在可以通过指定要使用的扩展名为例如直接调用_487123来保存downloadHandler创建的临时文件 ."pdf"
(而不是传入设备功能) . 这将以上示例简化为以下内容这是一个允许使用ggsave来保存闪亮图的解决方案 . 它使用逻辑复选框和文本输入来调用
ggsave()
. 将其添加到sidebarPanel
内的ui.R
文件中:然后将其添加到
server.R
文件而不是当前output$plot
reactivePlot函数:然后,用户可以在文本框中键入所需的文件名(不带扩展名),勾选复选框以保存在app目录中 . 取消选中该框会再次打印该图 . 我确信有更简洁的方法可以做到这一点,但至少我现在可以在windows中使用ggsave和cairo来获得更好的png图形 .
请添加您的任何建议 .
我没有设法使它与
ggsave
一起使用,但是通过标准调用png()
似乎没问题 .我只更改了
server.R
文件的output$downloadPlot
部分:请注意,我在0.3版本的闪亮版中遇到了一些问题,但它与Github的最新版本一起使用: