2016-05-08 7 views
4

Ich schreibe gerade ein Paket in R, und ich möchte eine Funktion schreiben, um einen standardisierten PDF-Bericht, einschließlich Text und Bilder, Diagramme und dergleichen zu generieren.Erstelle Bericht in R

Ich habe zum Beispiel knitr viele Male verwendet, aber ich möchte einen Bericht mit einer einzigen (vordefinierten) Funktion generieren, um die Dinge für den Endbenutzer sehr einfach zu machen.

Im Moment bin ich geneigt, eine Funktion zu schreiben, die die knitr-Ausgabe erzeugt und in eine Datei ablegt, dies würde jedoch erfordern, dass der Benutzer die notwendigen pdflatex-Befehle ausführt, um diese erzeugte Datei in den eigentlichen Bericht umzuwandeln. Auch das wird das Arbeitsverzeichnis mit Hilfsdateien usw. durcheinander bringen ...

Wenn jemand den besten Weg, dies zu tun hat oder weiß, ich begrüße jeden Rat.

+0

Hier ist eine Kopie von @ Benjamins Kommentar zu meiner gelöschten Antwort: "Wenn Sie es in das Paket aufnehmen möchten, können Sie die Datei report.rmd im Verzeichnis inst in ablegen und dann rmarkdown :: render aufrufen (input = system. Datei ("report.rmd", Paket = "[pkg_name]"), ...), innerhalb von generate_report(). Dies sollte die Notwendigkeit für ein anderes Projekt beseitigen, und alle Inhalte im Paketverzeichnis vollständig enthalten. " –

+0

Wenn es nicht notwendig ist, dass Sie eine PDF generieren, sollten Sie sich das [ReporterRs] (http://davidgohel.github.io/ReporteRs/) Paket ansehen, mit dem Sie Word und/oder PowerPoint-Dokumente. – Konrad

+0

Kennen Sie "strick2pdf"? Dies macht "dann erforderlich, dass der Benutzer die notwendigen pdflatex-Befehle ausführt ..." veraltet. –

Antwort

0

Ich schrieb shell script, die ein reguläres R-Skript als Eingabe nimmt und ein PDF-Dokument mit der R-Ausgabe einschließlich Plots ausgibt.

Es funktioniert durch eine Zwischen R Skript mit allen notwendigen Textvorschlag erstellen, mit Hilfe einer Schablone wie

#'\documentclass[a4paper,10pt]{printout} 
#'\title{@@[email protected]@} 
#'\begin{document} 
setHook(packageEvent("lattice", "attach"), 
     function(...) { 
      lattice.options(default.theme=standard.theme(color=FALSE)) 
      trellis.par.set(fontsize=list(text=9, points=6)) 
     }) 
opts_chunk$set(dev='pdf', fig.width=6, fig.height=4.5, 
       fig.path='./fig/@@[email protected]@-') 

@@[email protected]@ 

#'\end{document} 

die dann spin() ‚ed zu PDF. Ich denke, etwas ähnliches könnte in R.

1

Ich neigen dazu, meine Analyse/Ausgabe in Funktionen, aber ich rufe sie immer noch aus .RMD-Dateien mit der YAML an der Spitze und ein paar Brocken. Unterhalb einem nackten Knochen .Rmd Datei sein würde, dass ich um die anderen Befehle navigieren würde ... (mein Manager scheint ‚Knit Wort‘ oder ‚Knit HTML‘ ok genug. Zu mögen klicken)

--- 
title: "My Title" 
output: 
    word_document: 
    fig_caption: yes 
    fig_height: 3.5 
    fig_width: 6.5 
    reference_docx: template.docx 
    html_document: 
    fig_caption: yes 
    fig_height: 3.5 
    fig_width: 6.5 
    keep_md: yes 
    toc: yes 
--- 


```{r initialize, results='hide'} 
library(knitr) 
ProjRoot <- 'E:/Dropbox/test' 
setwd(ProjRoot) 
opts_chunk$set(dpi=150) 
``` 


```{r Analysis, results='hide'} 
source('E:/Dropbox/test/myFunction.R') 
load('E:/Dropbox/test/5parm.rdata') 
myFunction 
``` 

Meine obige Funktion (myFunction.R) wird sich stark auf knitr :: kable oder pander :: pandoc.table für Tabellen verlassen. Ich habe eine Reihe von Hilfsfunktionen, beispielsweise die unten Funktion, · H 2, druckt eine zweite Ebene Header aus

.H2 <- function(text) { 
    pander::pandoc.header(text, 2) 
} 

Also, macht es ziemlich schmerzlos Header in Marke, Push-out nach unten

1

So die Lösung kam ich mit, war die .Rmd Berichtsdatei-Vorlagen im /inst/rmd/ Ordnerverzeichnis des Pakets zu setzen, und dann eine Funktion wie folgt schreiben:

generateReport = function(df,output_format=NULL,output_file=NULL,output_dir="./",...){ 

    #Determine the template 
    theFile = system.file("rmd/report.Rmd", package="MYPACKAGENAME") 

    #Process the Arguments 
    args    = list(...) 
    args$input   = theFile 
    args$output_dir = output_dir 
    args$output_format = output_format 
    args$output_file = output_file 

    #Run the render 
    outputFileName = do.call('render',args=args) 
    invisible(outputFileName) 
} 

der Bericht selbst auf einem Objekt abhängt ‚df genannt ', die an die obige Funktion übergeben wird. Weitere Überprüfungen können hinzugefügt werden, und in der Tat habe ich dies in meiner Arbeitsversion getan, das obige veranschaulicht einfach die Grundlagen.