我正在试图找出如何使用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')
)
))
Run Code Online (Sandbox Code Playgroud)
对于 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())
}
)
})
Run Code Online (Sandbox Code Playgroud)
如果您正在回答这个问题,那么您可能对此很熟悉,但为了实现这一点,请将上述内容保存到单独的脚本中(ui.R并保存到工作目录中server.R的文件夹(foo)中.要运行闪亮的应用程序,请运行runApp("foo").
使用ggsave,我收到一条错误消息,指出ggsave无法使用该filename功能(我认为).如果我使用标准图形设备(如下所示),Download Plot工作没有错误,但它不写图形.
任何提示下载处理程序工作用于编写绘图的提示将不胜感激.
seb*_*opf 57
不确定这个问题是否仍然有效,但它是第一个在搜索"在闪亮的应用程序中保存情节"时出现的问题所以我想快速添加如何让ggsave与原始问题的行一起使用downloadHandler.
juba使用直接输出而不是ggsave建议的替代策略和alexwhan自己提出的替代策略都很有效,这只适用于那些绝对想在downloadHandler中使用ggsave的人.
alexwhan报告的问题是由ggsave尝试将文件扩展名与正确的图形设备匹配引起的.但是,临时文件没有扩展名,因此匹配失败.这可以通过在ggsave函数调用中专门设置设备来解决,就像在原始代码示例中一样(对于png):
output$downloadPlot <- downloadHandler(
filename = function() { paste(input$dataset, '.png', sep='') },
content = function(file) {
device <- function(..., width, height) grDevices::png(..., width = width, height = height, res = 300, units = "in")
ggsave(file, plot = plotInput(), device = device)
}
)
Run Code Online (Sandbox Code Playgroud)
这个调用基本上采用的device函数的png是ggsave内部分配(你可以看看ggsave功能代码来查看语法jpg,pdf等).也许,理想情况下,可以指定文件扩展名(如果与文件名不同 - 就像临时文件的情况一样)作为ggsave参数,但此选项目前不可用ggsave.
一个最小的独立工作示例:
library(shiny)
library(ggplot2)
runApp(list(
ui = fluidPage(downloadButton('foo')),
server = function(input, output) {
plotInput = function() {
qplot(speed, dist, data = cars)
}
output$foo = downloadHandler(
filename = 'test.png',
content = function(file) {
device <- function(..., width, height) {
grDevices::png(..., width = width, height = height,
res = 300, units = "in")
}
ggsave(file, plot = plotInput(), device = device)
})
}
))
sessionInfo()
# R version 3.1.1 (2014-07-10)
# Platform: x86_64-pc-linux-gnu (64-bit)
#
# locale:
# [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
# [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
# [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
# [9] LC_ADDRESS=C LC_TELEPHONE=C
# [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
#
# other attached packages:
# [1] ggplot2_1.0.0 shiny_0.10.1
#
# loaded via a namespace (and not attached):
# [1] bitops_1.0-6 caTools_1.17 colorspace_1.2-4 digest_0.6.4
# [5] formatR_1.0 grid_3.1.1 gtable_0.1.2 htmltools_0.2.6
# [9] httpuv_1.3.0 labeling_0.2 MASS_7.3-34 munsell_0.4.2
# [13] plyr_1.8.1 proto_0.3-10 Rcpp_0.11.2 reshape2_1.4
# [17] RJSONIO_1.3-0 scales_0.2.4 stringr_0.6.2 tools_3.1.1
# [21] xtable_1.7-3
Run Code Online (Sandbox Code Playgroud)
从ggplot2版本2.0.0开始,该ggsave函数支持device参数的字符输入,这意味着现在可以通过直接调用保存由downloadHandler创建的临时文件,方法是ggsave指定要使用的扩展名应该是例如"pdf"(而不是通过在设备功能).这将以上示例简化为以下内容
output$downloadPlot <- downloadHandler(
filename = function() { paste(input$dataset, '.png', sep='') },
content = function(file) {
ggsave(file, plot = plotInput(), device = "png")
}
)
Run Code Online (Sandbox Code Playgroud)
ale*_*han 22
这是一个允许使用ggsave来保存闪亮图的解决方案.它使用逻辑复选框和文本输入来调用ggsave().将其添加到ui.R文件里面sidebarPanel:
textInput('filename', "Filename"),
checkboxInput('savePlot', "Check to save")
Run Code Online (Sandbox Code Playgroud)
然后将其添加到server.R文件而不是当前的output$plotreactivePlot函数:
output$plot <- reactivePlot(function() {
name <- paste0(input$filename, ".png")
if(input$savePlot) {
ggsave(name, plotInput(), type="cairo-png")
}
else print(plotInput())
})
Run Code Online (Sandbox Code Playgroud)
然后,用户可以在文本框中键入所需的文件名(不带扩展名),勾选复选框以保存在app目录中.取消选中该框会再次打印该图.我确信有更简洁的方法可以做到这一点,但至少我现在可以在windows中使用ggsave和cairo来获得更好的png图形.
请添加您的任何建议.
jub*_*uba 21
我没有设法让它工作ggsave,但通过标准调用png()似乎没关系.
我只更改了文件的output$downloadPlot一部分server.R:
output$downloadPlot <- downloadHandler(
filename = function() { paste(input$dataset, '.png', sep='') },
content = function(file) {
png(file)
print(plotInput())
dev.off()
})
Run Code Online (Sandbox Code Playgroud)
请注意,我在0.3版本的闪亮版上遇到了一些问题,但它与Github的最新版本一起使用:
library(devtools)
install_github("shiny","rstudio")
Run Code Online (Sandbox Code Playgroud)
voc*_*ict 17
这是旧的,但当有人谷歌"R闪亮保存ggplot"时,仍然是最受欢迎的,所以我将贡献另一种解决方法.非常简单...在显示图形的同一函数中调用ggsave,这将把图形保存为服务器上的文件.
output$plot <- renderPlot({
ggsave("plot.pdf", plotInput())
plotInput()
})
Run Code Online (Sandbox Code Playgroud)
然后,使用downloadHandler并使用file.copy()将现有文件中的数据写入"file"参数.
output$dndPlot <- downloadHandler(
filename = function() {
"plot.pdf"
},
content = function(file) {
file.copy("plot.pdf", file, overwrite=TRUE)
}
)
Run Code Online (Sandbox Code Playgroud)
适合我.