gpt4 book ai didi

r - 如何保存在 Shiny 的应用程序中制作的绘图

转载 作者:行者123 更新时间:2023-12-03 05:17:19 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用 downloadButton 来保存 Shiny 的绘图。包中的示例演示了 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.Rserver.R 到工作目录中的文件夹 (foo) 中。要运行 Shiny 的应用程序,请运行 runApp("foo")

使用ggsave,我收到一条错误消息,指示ggsave无法使用filename函数(我认为)。如果我使用标准图形设备(如下所示),下载绘图可以正常工作,不会出现错误,但不会写入图形。

任何让 downloadHandler 用于编写绘图的提示将不胜感激。

最佳答案

不确定这个问题是否仍然有效,但这是搜索“在 Shiny 的应用程序中保存绘图”时出现的第一个问题,所以我想快速添加如何让 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)
}
)

此调用基本上采用 device 函数来获取 pngggsave 在内部分配(您可以查看 ggsave code> 函数代码以查看 jpgpdf 等的语法)。也许,理想情况下,可以将文件扩展名(如果与文件名不同 - 就像临时文件的情况)指定为 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

更新

从 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")
}
)

关于r - 如何保存在 Shiny 的应用程序中制作的绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14810409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com