Sikerült R-rel olyan jelentést készítenem, amit utólag tudok szerkesztgetni Wordben. Hogy ez miért nagy szám? Mert egyben megírhatom a kódot, meg közérakhatom a fejezetcímeket, és így tulajdonképpen készen lehetnek az ábrák amikről csak írnom kell, ha szeretnék, oldalakat. De ha nagyon ismerem az anyagot, akár ott helyben, R-kódok között megírhatom a jelentést.
Ez alapvetően nem annyira nagy dolog, hiszen a Rapporter már régóta csinál ilyet.
Én először csak véletlenül akadtam Tal Galili blogján a leírásra, és bevallom, nem is teljesen értem a mögöttes rendszerek működését. Hogy mit és pontossan hogy csinál a pandoc? Hogy miket jelentenek a knitr csomag beállításai? Fogalmam sincs. Viszont a magam dolgának megkönnyítése végett az ott leírt folyamat köré írtam egy függvényt, ezt most leírom, hogy működik (ami nem nagy dolog, nagyjából megegyezik azzal, amit a hivatkozott bejegyzésben Tal is leírt).
1.: R-ben telepítsd a pander csomagot, ami minden más szükséges csomagot telepíttetni fog.
1 |
install.packages("pander") |
2.: Telepítds a pandoc nevű programot. Ennek kétféle módja van:
2a.: R-ből az installr csomag segítségével
1 2 3 4 5 6 |
# intallr csomag telepítése, ha kell: if(!require(installr)) { install.packages("installr")} # installr betöltése: require(installr) # pandoc telepítése install.pandoc() |
Ennek a módszernek az a hátránya, hogy nekem nem működött sehogysem az install.pandoc(). Ezért megpróbáltam natúr, magamtól telepíteni.
2b.: Telepítés önmagában:
A pandoc elérhető a Github-on, letöltöd, majd futtatod az msi fájlt, telepítés után pedig
3. Indítsd újra a gépet!
Ez fontos, e nélkül a pandoc nem fog rendesen működni (valószínűleg. De lehet, hogy igen).
Ezzel tulajdonképp megvannak az alapok.
4. Írd meg, amit szerkeszteni szeretnél utána
A markdown alapszabályai szerint, illetve R markdownban. Nem bonyolultak az alapok, érdemes utánanézni. Miután pedig kész, elmented, és megjegyzed hogy hol és milyen néven van a fájl.
5.: rmd2docx(source)
Innentől jön az általam egy parancsba gyógyított eljárás, ami a következőképp néz ki:
(A source helyére természetesen nem mást, mint a korábban elmentett markdown fájl helyét és nevét (teljes fájlnév, elérési út) kell beírni két idézőjel közé, entert nyomni, és már hasít is a gép)
5a.: Először beállítja a megadott fájl mappáját munkakönyvtárnak (ez később lehet, hogy problémát fog okozni, egyelőre kézenfekvőnek tűnik), aztán megkeresi a fájlnevet, majd külön a kiterjesztést, hogy megnézi, rmd fájl-e a bemenet. Mivel a kiterjesztés nem jelent semmit, ezért csak üzenet a usernek, lehet hogy lefelejtette:
1 2 3 4 5 6 7 |
setwd(dirname(source)) FILE <- basename(source) NAME <- strsplit(FILE, ".", fixed=TRUE)[[1]][1] ext <- strsplit(FILE, ".", fixed=TRUE)[[1]][2] if(!(tolower(ext)=="rmd")){ message("Are you sure you use an R markdown file?") } |
5b.: Beolvassa a megadott fájlt, az elejéhez hozzáfűzi a megadott beállításokat, majd egy ideiglenes fájlba elmenti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
opts.for.docx <- '```{r set_knitr_chunk_options} opts_chunk$set(echo=FALSE,message=FALSE,results = "asis") # important for making sure the output will be well formatted. ``` ```{r load_pander_methods} require(pander) replace.print.methods <- function(PKG_name = "pander") { PKG_methods <- as.character(methods(PKG_name)) print_methods <- gsub(PKG_name, "print", PKG_methods) for(i in seq_along(PKG_methods)) { f <- eval(parse(text=paste(PKG_name,":::", PKG_methods[i], sep = ""))) # the new function to use for print assign(print_methods[i], f, ".GlobalEnv") } } replace.print.methods() ## The following might work with some tweaks: ## print <- function (x, ...) UseMethod("pander") ```' # append them to the file: tempfile <- readLines(FILE) tempfile <- c(opts.for.docx, tempfile) writeLines(tempfile, "tempfile.rmd") |
5c.: Betölti a knitr csomagot, majd előbb hagyományos markdown fájlt készít belőle (feldolgozza az R kódokat), aztán összerak belőlük egy html fájlt:
1 2 |
require("knitr", quietly=TRUE) knit2html("tempfile.rmd") |
Eddig ezt csak ábrák nélküli dokumentummal próbáltam. Érdemes lenne létrehozatni az R-rel egy mappát, hogy abba mentse, amit aztán egy az egyben lehetne törölni, mint szemetet, miután kész. Ez a jövő zenéje még.
5d.: Miután megvan a markdown fájl, a pandoc-kal készíttetünk belőle a word által olvasható fájlt:
1 |
system(paste0("pandoc -o ", NAME, ".docx ", "tempfile", ".md")) |
A második argumentuma a paste0() függvénynek nem más, mint az eredeti rmd fájl neve, így név alapján könnyen megtaláljuk majd az új fájlt, illetve külöböző fájlok nem fogják egymást felülírni.
5e.: Ezután pedig töröljük a korábban létrehozott markdown és html fájlokat:
1 |
unlink(c("tempfile.html", "tempfile.md")) |
És fel is takarítottunk magunk után, az eredeti fájl mellett ott virít büszkén a Worddel szerkeszthető doksi, benne az alap formázásnak megfelelő kínézetű, stílusokkal rendelkező szöveg, táblázatok, képek, sikeresen megoldottuk a feladatot. o/
A kód egészében természetesen elérhető GitHub-on!