如何用R來定製個性化PPT

ReporteRs包能夠建立word,ppt,html文檔。它能夠格式化R的輸出:如可編輯的矢量圖,複雜的表格報告功能,企業模板文檔的重用(.docx和.pptx)。它是一個很好的自動化報告工具,而且不須要你安裝微軟的任何產品。須要注意的是,電腦需安裝了java(>=1.6)本文演示的是如何用它來製做PPT文檔。html

入門

建立一個pptx對象

經過pptx函數建立的一個R對象能夠表示一個PPT文檔。它包含兩個參數:標題和模板文件。若是未指定,模板文件在包目錄下是一個空文檔。java

每當建立一個pptx對象的時候,你就可使用一個模板文件。這個文件是從內存中複製過來的,而且副本能夠經過R輸出爲一個文檔。模板文件提供了可用的格式和幻燈片版式。git

將R的輸出結果發送到一個對象

接下來,建立pptx文件的組成部分。github

在將R的輸出發送到一個文檔(或幻燈片)以前,必須添加一個幻燈片。經過函數addSlide能夠實現。ide

在添加幻燈片的時候,須要選定一個佈局。而後添加文本,表格,圖形和其它組成部分。函數

將對象寫入到一個文件中

最後,使用函數writeDoc將對象寫入到後綴爲.pptx的文件中。工具

示例

下面咱們經過一個帶有註解的R腳原本作演示:佈局

library( ReporteRs )

# 建立一個pptx對象的文檔(默認模板)
mydoc = pptx( )

# 檢測佈局名稱
slide.layouts(mydoc)

mydoc = addSlide( mydoc, "Two Content" )
# 將iris數據集的前10行添加到mydoc
mydoc = addTitle( mydoc, "First 10 lines of iris" )
mydoc = addFlexTable( mydoc, FlexTable(iris[1:10,] ) )

# 在mydoc中添加文本(從addParagraph函數的value參數能夠看出第一行爲空行)
# 屬性值由正在使用的佈局格式給定
mydoc = addParagraph( mydoc, value = c("", "Hello World!") )

mydoc = addSlide( mydoc, "Title and Content" )
# 在mydoc中添加圖形
mydoc = addPlot( mydoc, function() barplot( 1:8, col = 1:8 ) )

# 將mydoc寫入文檔中(在當前工做目錄下會生成一個ppt)
writeDoc( mydoc, "pp_simple_example.pptx" )

模板,版式和樣式

pptx函數能夠經過"pptx"模板文件建立一個文檔。字體

若是沒有提供,可使用一個空文檔(在包目錄下的templates文件中能夠找到)ui

# 使用D:/docs/template/my_corporate_template.pptx做爲模板(需在上述路徑先建立一個名稱爲my_corporate_template.pptx的ppt,不然提示文件無效)
    doc = pptx(template = 'D:/docs/template/my_corporate_template.pptx')
# 使用默認模板
    doc = pptx()

ReporteRs使用PPT文件做爲模板。這個模板是一個最原始的PPT文檔,全部的幻燈片佈局,外形(佔位符)和樣式來自於:

  • 模板中可用的幻燈片版式

  • 模板中自定義好的設計,模板格式和外形(模板中的佔位符)

  • ppt模板的內容不會被刪除,以便在現有的演示文稿中添加內容,而不用再複製粘貼。

若是對這些PPT版式的術語不太瞭解,能夠參考這兩篇文章:自定義版式-修改佔位符

若是須要除了PPT內置的幻燈片母版版式,能夠在你的PPT演示文稿中添加版式並作自定義。要添加本身的版式,只需在PPT中按以下操做便可:

  1. 切換到幻燈片母版視圖

  2. 插入版式

  3. 插入你想要增長到新版式中的佔位符。根據須要包含的內容移動並調整它們的大小。

  4. 能夠對新的佔位符作些設置(如:修改背景顏色,字體等)

  5. 保存並關閉模板

  6. 經過pptx函數中參數template所指定的模板文件名建立一個pptx對象。

關於模板的更多瞭解,參考這裏

添加內容

添加幻燈片

利用addSlide函數能夠在pptx對象中添加一個幻燈片。可用的形狀數根據所選的版式經過R輸出來填充。例如,版式"Title and Content"只能接收一個R輸出,"Two Content"能夠接收兩個R輸出。

若是你須要一個新的版式,在PPT中建立它。

當添加一個R輸出的時候,若是沒有指定位置和大小,R輸出會採用被定義的模板版式中的位置和尺寸。若是你不喜歡模板中的模型位置屬性,能夠強制改變大小和位置。

將R的輸出結果發送到幻燈片

接下來,建立幻燈片的組成部分。

在幻燈片中添加文本,表格,圖形和其它組成部分。可用的函數見以下函數列表

若是如今的幻燈片沒有剩餘空間或者是你想添加其它內容,能夠強制設定模型的大小和位置。具體可參考幾個關鍵的函數和參數

函數列表

下面這些函數能夠用於輸出格式爲pptx的文檔:

  • 添加標題:addTitle

  • 添加表格:addFlexTable-見FlexTableaddFlexTable

  • 添加圖形:見addPlot

  • 添加外部圖像:見addImage

  • 添加文本段落:addPagraph

  • 添加語法高亮的R代碼:見addRScript

  • 添加幻燈片:addSlide(見"幾個關鍵的函數和參數")

  • 將pptx對象寫入PPT文檔:見writeDoc

  • 添加日期:addDate(見下述"幾個特殊函數")

  • 添加腳註:addFooter(見下述"幾個特殊函數")

  • 添加頁數:addPageNumber(見下述"幾個特殊函數")

幾個關鍵的函數和參數

addSlide函數

函數addSlide能夠添加一個幻燈片到pptx對象。參數slide.layout指定新建幻燈片的版式設計。

oc = pptx()
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addSlide( doc, slide.layout = 'Two Content' )

slide.layouts函數

模板中包含了可用的版式。幻燈片的版式概念在ReporteRs中很是重要。

內容取決於所選擇的版式。當添加的幻燈片版式爲"Title and Content"時,幻燈片只包含兩個部分:標題和內容。

外形(或佔位符)的大部分格式都已經設置好了:圖形的大小由版式中的外形尺寸指定好了,默認字體和段落樣式也由外形的屬性值指定。

slide.layouts返回幻燈片版式名稱。用addSlide函數添加一個幻燈片的時候可能須要覈對下有哪些版式可用。

doc = pptx()
slide.layouts(doc)

檢查幻燈片版式

經過slide.layouts函數的可選參數layout獲取版式的設計圖。

 slide.layouts(doc, 'Comparison')

這裏,幻燈片可用接收以下形狀:標題,四個內容(圖形,表格,段落),日期和幻燈片數。

設置大小和位置

寬度,高度和輸出位置在PPT模板給定的時候就經過外形屬性值設定好了。當咱們在幻燈片中添加內容的時候,ReporteRs會在當前幻燈片中讀取下一個可用外形的屬性值。你能夠指定一些特定輸出(表格,文本,圖形和外部圖像)的外形位置和尺寸 若是沒有設定offx,offy,width,heigh這些參數。位置的尺寸會經過幻燈片的下一個可用形狀中的width和heigh默認設定好。 若是指定這些參數,能夠獲得新的外形位置和尺寸。這樣作能夠在幻燈片沒有更多剩餘的空間時添加新的內容。

如下R腳本能夠生成

library( ReporteRs )
library( ggplot2 )

mydoc = pptx( title = "title" )

mydoc = addSlide( mydoc, slide.layout = "Title and Content" )

myplot = qplot(Sepal.Length, Petal.Length, data = iris,
  color = Species, size = Petal.Width, alpha = I(0.7) )

mydoc = addPlot( doc = mydoc, fun = print, x = myplot,
  offx = 1, offy = 1, width = 6, height = 5 )

mydoc = addFlexTable( doc = mydoc, FlexTable( head( iris ) ),
  offx = 8, offy = 2, width = 4.5, height = 3 )

writeDoc( mydoc, file = "examples/pp_force_pos.pptx" )

幾個特殊函數

日期

利用addDate函數能夠在幻燈片中增長日期。它的形狀經過模板文檔中的日期形狀屬性值設定。

doc = pptx()
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addDate( doc )
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addDate( doc, 'Dummy date' )

頁數

利用函數addPageNumber能夠在幻燈片中添加幻燈片的頁數。一樣,它的形狀經過模板文檔中的頁數形狀屬性值設定。

doc = pptx()
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addPageNumber( doc )
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addPageNumber( doc, 'Dummy text' )

頁腳

函數addFooter能夠實如今幻燈片的頁腳處添加註解。一樣,經過模板文件默認設定。

doc = pptx()
doc = addSlide( doc, slide.layout = 'Title and Content' )
doc = addFooter( doc, 'Dummy text' )

副標題

函數addSubtitle實如今幻燈片中添加副標題。外形由模板默認設定。

副標題的外形只存在類型爲"Title Slide"的幻燈片。

doc = pptx()
doc = addSlide( doc, slide.layout = 'Title Slide' )
doc = addTitle( doc, 'Presentation title' )
doc = addSubtitle( doc , 'This document is generated with ReporteRs.')

更換幻燈片

經過設定addSlide中的參數bookmark能夠實現幻燈片的替換。

library( ReporteRs )
library( ggplot2 )

#需提早在你的工做目錄下新建一個名爲"pp_example.pptx"的文檔
mydoc = pptx( title = 'title', template = 'pp_example.pptx' )

myplot = qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

mydoc = addSlide( mydoc, slide.layout = 'Title and Content', bookmark = 3 )

mydoc = addTitle( mydoc, 'my new graph')

mydoc = addPlot( mydoc, print, x = myplot )

writeDoc( mydoc, 'pp_replacement.pptx' )

注:在本文中遇到的坑跟你們分享下。

  1. 前面已經提到建立一個模板有兩種方法。方法一,mydoc = pptx()經過調用包目錄下templates文件夾中的EMPTY_DOC.pptx做爲模板。方法二,本身在當前工做目錄下新建一個ppt文檔做爲模板。如:我在工做目錄下新建了一個名爲"PP_example.pptx"文檔,經過mydoc = pptx( title = 'title', template = 'pp_example.pptx' )調用這個模板。這兩種方法會有些區別:i)版式

採用方法一

slide.layouts(mydoc)
 [1] "Blank"                  
 [2] "Title Only"             
 [3] "Title and Content"      
 [4] "Section Header"         
 [5] "Title and Vertical Text"
 [6] "Comparison"             
 [7] "Content with Caption"   
 [8] "Title Slide"            
 [9] "Two Content"            
[10] "Vertical Title and Text"

採用方法二

slide.layouts(mydoc)
 [1] "比較"               "僅標題"             "圖片與標題"        
 [4] "垂直排列標題與文本" "節標題"             "標題和豎排文字"    
 [7] "兩欄內容"           "標題和內容"         "空白"              
[10] "內容與標題"         "標題幻燈片"

因此,若是用的是方法二調用的模板,在作幻燈片替換的時候作下中文設置便可:mydoc = addSlide( mydoc, slide.layout = '標題和內容', bookmark = 3 )。但這裏有一個問題就是沒法插入圖形,出現以下錯誤(若是有小夥伴解決了這個問題歡迎在下面評論中留言):

mydoc = addPlot( mydoc, print, x = myplot )

Error in .jcall(doc$obj, paste0("L", class.pptx4r.LayoutDescription, ";"),  : 
  java.lang.NullPointerException

但文本,表格等能夠插入。但經過方法一獲得一個ppt文檔,再把它做爲模板後就能夠插入圖形了。

  1. 在作幻燈片替換的過程當中,將pptx對象writeDoc()到ppt文檔的時候ppt需先關閉。

  2. 用方法二做爲模板的時候,需先在工做目錄下新建一個ppt文檔,不然提示文件不存在。

完整案例

下面的代碼展現了能夠用在pptx對象上的一些最有用的函數。

library( ReporteRs )
require( ggplot2 )

mydoc = pptx( title = "title" )

# 顯示版式名稱
slide.layouts( mydoc )

# 添加一個 Title slide -------------------------------------------------------
mydoc = addSlide( mydoc, slide.layout = "Title Slide" )

mydoc = addTitle( mydoc, "Presentation title" ) #設置主標題
mydoc = addSubtitle( mydoc , "This document is generated with ReporteRs.")#設置副標題


# 圖形演示 ---------------------------------------------------------------
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "Plot examples" )

myplot = qplot(Sepal.Length, Petal.Length
                , data = iris, color = Species
                , size = Petal.Width, alpha = I(0.7)
)
# 將圖形添加到ppt
mydoc = addPlot( mydoc, function( ) print( myplot ) )

# 添加頁數,日期,腳註
mydoc = addPageNumber(mydoc)
mydoc = addDate(mydoc)
mydoc = addFooter(mydoc, "Modify the graph within PowerPoint")

# 表格演示----------------------------------------------------------
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "FlexTable example" )

options( "ReporteRs-fontsize" = 12 )

# 將mtcars數據框對象建立爲一個可伸縮的表格並顯示行名
# 將表頭和表體設置爲不一樣的格式屬性
MyFTable = FlexTable( data = mtcars[1:15,], add.rownames = TRUE
                , body.cell.props = cellProperties( border.color = "#EDBD3E")
                , header.cell.props = cellProperties( background.color = "#5B7778" )
)
# 斑馬線 - 錶行的顏色背景是交替出現的
MyFTable = setZebraStyle( MyFTable, odd = "#DDDDDD", even = "#FFFFFF" )
MyFTable = setFlexTableWidths( MyFTable, widths = c(2,rep(.7,12)))

# 設置表格邊框線
MyFTable = setFlexTableBorders(MyFTable
        , inner.vertical = borderProperties( color="#EDBD3E", style="dotted" )
        , inner.horizontal = borderProperties( color = "#EDBD3E", style = "none" )
        , outer.vertical = borderProperties( color = "#EDBD3E", style = "solid" )
        , outer.horizontal = borderProperties( color = "#EDBD3E", style = "solid" )
)

# 添加可伸縮表格 
mydoc = addFlexTable( mydoc, MyFTable )

# 文本演示 ----------------------------------------------------------------
# 設置默認字體大小爲26
options( "ReporteRs-fontsize" = 26 )

# 添加一個版式爲"Two Content"的幻燈片
mydoc = addSlide( mydoc, slide.layout = "Two Content" )

# 添加標題
mydoc = addTitle( mydoc, "Texts demo" )
texts = c( "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
  , "In sit amet ipsum tellus. Vivamus dignissim arcu sit amet faucibus auctor."
        , "Quisque dictum tristique ligula."
)

# 添加文本
mydoc = addParagraph( mydoc, value = texts  )

# 添加內容 "My tailor is rich" 和 "Cats and Dogs"
# 設置文本中某些片斷的格式
pot1 = pot("My tailor" , textProperties(color="red" ) ) + " is " + pot("rich", textProperties(font.weight="bold") )
pot2 = pot("Cats", textProperties(color="red" ) ) + " and " + pot("Dogs", textProperties(color="blue" ) )

mydoc = addParagraph(mydoc, set_of_paragraphs( pot1, pot2 ) )

writeDoc( mydoc, file = "pp_long_demo.pptx" )

關於ReporteRs的更多信息請參考http://davidgohel.github.io/ReporteRs/index.html

本文由雪晴數據網負責翻譯整理,原文請參考Create PowerPoint documents from R做者David Gohel。轉載請註明本文連接http://www.xueqing.cc/cms/article/118

相關文章
相關標籤/搜索