使用ReporteRs包在R Shiny中生成PowerPoint幻灯片

5
我有一个R闪亮的代码,可以制作各种报告、词云、情感分析和其他各种内容。现在我想通过点击一个按钮,在一次下载中将生成的所有这些报告附加到ppt中。例如,它应该像这样:
幻灯片1:词云
幻灯片2:情感分析
幻灯片3:报告1 ...等等
迄今为止,我可以单独下载所有这些报告,即我的Shiny UI中有不同的选项卡,每个报告都有一个“下载”按钮,点击后使用downloadHandler进行下载。
此外,我也可以在一个单击中将所有这些报告下载到一个pdf中,即在一页上有报告1等等。
迄今为止,我已经达到了以下程度:
    #downloadReport is my action button
    #on click of this button I am expecting the ppt. to be downloaded
    observeEvent(input$downloadReport, {
    # Create a PowerPoint document
    doc = pptx( )

    # Slide 1 : Title slide
    #+++++++++++++++++++++++
    doc <- addSlide(doc, "Title Slide")
    doc <- addTitle(doc,"Create a PowerPoint document from R software")
    doc <- addSubtitle(doc, "R and ReporteRs package")


   # Slide 2 : Add Word Cloud
    #+++++++++++++++++++++++
    doc <- addSlide(doc, "Title and Content")
    doc <- addTitle(doc, "Bar Plot")
    newData=rawInputData(); # Function which captures data (.csv file) when I have input it through R shiny
    words_list = strsplit(as.character(newData$CONTENT), " ") #CONTENT is the column which contains the test data
    words_per_tweet = sapply(words_list, length)
    pptwordcloud<-barplot(table(words_per_tweet), border=NA,main="Distribution of words per tweet", cex.main=1,col="darkcyan")
   #pptwordcloud<-barplot(table(words_per_tweet), col="darkcyan")
    doc <- addPlot(doc, fun= print, x = pptwordcloud,vector.graphic =FALSE ) 
    writeDoc(doc,'file1.pptx')
  })

使用选项vector.graphic =FALSE生成的ppt文件中看不到条形图。如果我删除此选项,将会出现以下错误:

警告:观察器中出现未处理的错误: javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.SAXParseException:文档中根元素之前的标记必须格式良好。] observeEvent(input$downloadReport)

请问是否有人能指出我的错误所在?

@Batanichek:我意识到了我的错误,现在我只使用addPlot(),因为我的worddownload()函数正在渲染图表。在进行这些更改后,我遇到了新的错误。请查看编辑后的问题。 - Rahul Agarwal
让我们看看你的函数返回了什么(不是在闪亮的R会话中,而是在简单的R会话中) - 在我的情况下是null(data(crude) tdm <- TermDocumentMatrix(crude) m<-as.matrix(tdm); word.freq<-sort(rowSums(m),decreasing=TRUE); minimum=4 p<-wordcloud(words=names(word.freq),freq=word.freq,min.freq=minimum,random.order=FALSE,colors=brewer.pal(8, "Dark2"),main="Title") p)。因此,也许更好的方法是在函数中将图形保存为png,然后添加图像? - Batanichek
在addPlot.pptx中,您可以看到“fun--plot函数”。该函数将被执行以生成图形。对于网格或lattice或ggplot对象,函数应该只是打印,并且额外的参数x应该指定要绘制的对象。对于传统的绘图,函数应该包含绘图指令。请参见示例。 - Batanichek
@Batanichek: 谢谢!! 问题解决了。它起作用了。 - Rahul Agarwal
1个回答

8

让我们试着重现 =)

1)我没有你的数据,所以我使用 iris,并选择用于选择第二列的输入作为table

用户界面(UI)

library(shiny)


shinyUI(

  # Use a fluid Bootstrap layout
  fluidPage(    
    selectInput("sel",label = "col",choices = colnames(iris)[2:ncol(iris)]),
    downloadButton('downloadData', 'Download')

  )
)

服务器

library(shiny)
library(DT)
library(ReporteRs)

shinyServer(function(input, output,session) {

  output$downloadData <- downloadHandler(
      filename = "file.pptx",
      content = function(file) {
        doc = pptx( )

        # Slide 1 : Title slide
        #+++++++++++++++++++++++
        doc <- addSlide(doc, "Title Slide")
        doc <- addTitle(doc,"Create a PowerPoint document from R software")
        doc <- addSubtitle(doc, "R and ReporteRs package")


        # Slide 2 : Add Word Cloud
        #+++++++++++++++++++++++
        doc <- addSlide(doc, "Title and Content")
        doc <- addTitle(doc, "Bar Plot")
        #newData=rawInputData(); # Function which captures data (.csv file) when I have input it through R shiny
        #words_list = strsplit(as.character(newData$CONTENT), " ") #CONTENT is the column which contains the test data
        #words_per_tweet = sapply(words_list, length)
        words_per_tweet=iris
        pptwordcloud<-function(){
          barplot(table(words_per_tweet[,c("Sepal.Length",input$sel)]), border=NA,main="Distribution of words per tweet", cex.main=1,col="darkcyan")
        }#pptwordcloud<-barplot(table(words_per_tweet), col="darkcyan")
        doc <- addPlot(doc, fun= pptwordcloud,vector.graphic =FALSE ) 
        writeDoc(doc,file)
       }
     )
  })

实际上,最后一部分是错误的,请查看下面的正确代码: doc <- addPlot(doc, fun=function()barplot(table(words_per_tweet[,c("Sepal.Length",input$sel)]), border=NA,main="每条推文的单词分布", cex.main=1,col="darkcyan"),vector.graphic =FALSE )@batanichek: 正如您在评论中所说,“对于网格或lattice或ggplot对象,函数应该只是打印,并且额外的参数x应该指定要绘制的对象。对于传统图表,函数应包含绘制指令”。这部分内容有助于我理解,再加上ReporteRs包的文档。 - Rahul Agarwal
你可以定义 barplot(table(words_per_tweet[,c("Sepal.Length",input$sel)]), border=NA,main="Distribution of words per tweet", cex.main=1,col="darkcyan") 作为新的绘图函数并使用它。你测试过我的代码了吗?它不起作用吗? - Batanichek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接