ReporteRs
包能夠建立word,ppt,html文檔。它能夠格式化R的輸出:如可編輯的矢量圖,複雜的表格報告功能,企業模板文檔的重用(.docx和.pptx)。它是一個很好的自動化報告工具,而且不須要你安裝微軟的任何產品。須要注意的是,電腦需安裝了java(>=1.6)本文演示的是如何用它來製做PPT文檔。html
經過pptx
函數建立的一個R對象能夠表示一個PPT文檔。它包含兩個參數:標題和模板文件。若是未指定,模板文件在包目錄下是一個空文檔。java
每當建立一個pptx對象的時候,你就可使用一個模板文件。這個文件是從內存中複製過來的,而且副本能夠經過R輸出爲一個文檔。模板文件提供了可用的格式和幻燈片版式。git
接下來,建立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中按以下操做便可:
切換到幻燈片母版視圖
插入版式
插入你想要增長到新版式中的佔位符。根據須要包含的內容移動並調整它們的大小。
能夠對新的佔位符作些設置(如:修改背景顏色,字體等)
保存並關閉模板
經過pptx函數中參數template
所指定的模板文件名建立一個pptx
對象。
關於模板的更多瞭解,參考這裏
利用addSlide
函數能夠在pptx對象中添加一個幻燈片。可用的形狀數根據所選的版式經過R輸出來填充。例如,版式"Title and Content"只能接收一個R輸出,"Two Content"能夠接收兩個R輸出。
若是你須要一個新的版式,在PPT中建立它。
當添加一個R輸出的時候,若是沒有指定位置和大小,R輸出會採用被定義的模板版式中的位置和尺寸。若是你不喜歡模板中的模型位置屬性,能夠強制改變大小和位置。
接下來,建立幻燈片的組成部分。
在幻燈片中添加文本,表格,圖形和其它組成部分。可用的函數見以下函數列表。
若是如今的幻燈片沒有剩餘空間或者是你想添加其它內容,能夠強制設定模型的大小和位置。具體可參考幾個關鍵的函數和參數
下面這些函數能夠用於輸出格式爲pptx的文檔:
添加標題:addTitle
添加表格:addFlexTable-見FlexTable和addFlexTable
添加圖形:見addPlot
添加外部圖像:見addImage
添加文本段落:addPagraph
添加語法高亮的R代碼:見addRScript
添加幻燈片:addSlide(見"幾個關鍵的函數和參數")
將pptx對象寫入PPT文檔:見writeDoc
添加日期:addDate(見下述"幾個特殊函數")
添加腳註:addFooter(見下述"幾個特殊函數")
添加頁數:addPageNumber(見下述"幾個特殊函數")
函數addSlide
能夠添加一個幻燈片到pptx對象。參數slide.layout
指定新建幻燈片的版式設計。
oc = pptx() doc = addSlide( doc, slide.layout = 'Title and Content' ) doc = addSlide( doc, slide.layout = 'Two Content' )
模板中包含了可用的版式。幻燈片的版式概念在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' )
注:在本文中遇到的坑跟你們分享下。
前面已經提到建立一個模板有兩種方法。方法一,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文檔,再把它做爲模板後就能夠插入圖形了。
在作幻燈片替換的過程當中,將pptx對象writeDoc()
到ppt文檔的時候ppt需先關閉。
用方法二做爲模板的時候,需先在工做目錄下新建一個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