【问题标题】:Downloading an Excel file with plots and dataframes from shiny. (Not working for plots)从 Shiny 下载带有绘图和数据框的 Excel 文件。 (不适用于地块)
【发布时间】:2017-02-24 19:08:39
【问题描述】:

你好闪亮的用户。

我遇到了一个问题,我似乎无法在各种论坛和网站上找到任何解决方案。 我将分享一个相对简单的可重现示例来说明我的问题。

我想做以下事情:上传一些数据,做一些处理和分析,然后把整堆输出放到一个 Excel 文件中,最后下载。 我在闪亮的服务器部分创建 Excel 并将数据框/表放入其中没有任何问题。但我无法将图像放入 Excel 文件中。

这是因为我使用的 xlsx 包中的 AddPicture 函数需要以下内容:


addPicture(file, sheet, scale=1, startRow=1, startColumn=1)

文件
图片文件的绝对路径。

片材
由 createSheet 或子集 getSheets 返回的工作表对象。图片将添加到此工作表的 startRow、startColumn 位置。

“图像文件的绝对路径”是问题所在。我不能有文件的绝对路径,就像我用 R 执行类似的脚本一样。或者我可以吗?


下面是一些显示错误的代码:

如果您按原样执行它,您将能够在第一张表中下载带有数据框的 Excel 文件,这没有问题。 (因为不需要绝对路径,只需要一个数据框对象) 服务器部分中带有# 的部分给我带来了问题。您可以取消注释以查看错误(错误:没有适用于 'grid.draw' 的方法应用于类 "NULL" 的对象)。有谁知道如何解决这个问题?

服务器

library(shiny)
library(xlsx)
library(ggplot2)

server <- function(input, output) {

output$download.Excel <- downloadHandler(

  filename = function() { paste("Excelfile.xlsx")},

  content = function(file){
       example_plot=plot(1:10,1:10)
       Results_Workbook <- createWorkbook(type='xlsx')
       A=as.data.frame(matrix(2,2,2))
       sheet.1 <- createSheet(Results_Workbook, sheetName = "Data frame")
       addDataFrame(A, sheet=sheet.1, startRow=4, 
       startColumn=2,row.names=FALSE)
       setColumnWidth(sheet.1,colIndex=c(1:100),colWidth=30)
       sheet.2 <- createSheet(Results_Workbook, sheetName = "Plot")
       # ggsave("plot",example_plot, device="emf")
       # addImage(file = "plot.emf", sheet = sheet.2, scale = 55,
       #          startRow = 4, startColumn = 4)
       saveWorkbook(Results_Workbook,file)
  } 

)
}

用户界面

library(shiny)

ui <- fluidPage(
   titlePanel("Simple classification script with R/Shiny"),
      sidebarLayout(
          sidebarPanel(
             downloadButton('download.Excel', 'Download')

             ),
          mainPanel(p("Description of the results")
          )
     )
)

最好的问候,

乔尔

【问题讨论】:

  • 你可以让ggsave保存到绝对路径,或者使用getwd()获取当前工作目录并重建路径(ggsave保存到当前工作目录)跨度>

标签: shiny


【解决方案1】:

这是一个有效的server.R 文件。请注意,我无法使用 emf 文件格式,但 jpeg 可以。

library(shiny)
library(xlsx)
library(ggplot2)

server <- function(input, output) {

  output$download.Excel <- downloadHandler(

    filename = function() { paste("Excelfile.xlsx")},

    content = function(file){
      example_plot=qplot(1:10,1:10)
      Results_Workbook <- createWorkbook(type='xlsx')
      A=as.data.frame(matrix(2,2,2))
      sheet.1 <- createSheet(Results_Workbook, sheetName = "Data frame")
      addDataFrame(A, sheet=sheet.1, startRow=4, 
                   startColumn=2,row.names=FALSE)
      setColumnWidth(sheet.1,colIndex=c(1:100),colWidth=30)
      sheet.2 <- createSheet(Results_Workbook, sheetName = "Plot")
      ggsave("plot.jpeg",example_plot, device="jpeg")
      addPicture(file = paste0(getwd(), "/plot.jpeg"), sheet = sheet.2, scale = 1,startRow = 4, startColumn = 4)
      saveWorkbook(Results_Workbook,file)
    } 

  )
}

【讨论】:

  • 非常感谢您的回答。如果你有兴趣让 emf 工作,我认为有一个奇怪的小技巧可以做到。
  • 如果你想发布这个技巧,这可能会在未来帮助其他人。如果有效,也请将答案标记为已接受。
  • 首先,使用 ggsave(),我也无法让它工作。
  • 没关系,它可能会。但我确信使用 savePlot(),当将绘图保存为 EMF 时,我成功了所以基本上,对我来说,至少当我只加载“xlsx”库时,将 EMF 文件导入 Excel 总是会失败。 (例如,png虽然有效)但是当我(按此顺序)加载“XLConnect”然后加载“xlsx”时,它可以工作。尽管我只使用 xlsx 函数,但加载 XLConnect 似乎有助于导入 EMF 文件,原因我不知道。 (他们都使用 Java 的东西,可能会发生冲突/交互,我不太明白)
  • 你是对的!出于某种奇怪的原因,首先加载XLConnect 会解决 emf 文件的问题。
猜你喜欢
  • 2017-04-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2019-10-17
  • 2018-04-19
  • 2012-06-20
相关资源
最近更新 更多