2016-08-04 35 views
0

Gibt es minimale oder noch größere, funktionierende Beispiele für die Verwendung von SCons und knitr, um Berichte aus .Rmd Dateien zu generieren?Beispiele für die Verwendung von SCons mit Knitr

knit eine cleaning_session.Rmd Datei von der Befehlszeile (bash shell) ing eine .html Datei abzuleiten, über getan werden können:

:

Rscript -e "library(knitr); knit('cleaning_session.Rmd')". 

In diesem example werden Rscript und Anweisungen an einen Make Datei eingespeist

RMDFILE=test 

html : 
    Rscript -e "require(knitr); require(markdown); knit('$(RMDFILE).rmd', '$(RMDFILE).md'); markdownToHTML('$(RMDFILE).md', '$(RMDFILE).html', options=c('use_xhtml', 'base64_images')); browseURL(paste('file://', file.path(getwd(),'$(RMDFILE).html'), sep='' 

In dieser Antwort https://stackoverflow.com/a/10945832/1172302 gibt es Berichten zufolge eine Lösung mit SCons. Aber ich habe nicht genug Tests gemacht, um es für mich funktionieren zu lassen. Im Wesentlichen wäre es toll, etwas wie das Beispiel zu haben, das bei https://tex.stackexchange.com/a/26573/8272 präsentiert wird.

+1

Können Sie uns einen Tipp geben, wie der Befehl zum Konvertieren einer '.Rmd' Datei nach TeX/LaTeX aussehen würde? Dann müssen Sie nur diesen Befehl in einen 'Befehl' oder einen korrekten Builder umwandeln, indem Sie dem Rat von https://bitbucket.org/scons/scons/wiki/ToolsForFools folgen und dann auf die erstellte TeX-Datei verweisen Quelle für den PDF-Builder. SCons sollten sich dann um den Rest kümmern ... – dirkbaechle

+0

@dirkbaechle danke für den Hinweis auf die richtige Dokumentation. Mit der Zeit werde ich versuchen, etwas ausgeklügelter zu bauen. –

Antwort

1

[Aktualisiert] Ein Arbeitsbeispiel ist eine Sconstruct Datei:

import os 
environment = Environment(ENV=os.environ) 

# define a `knitr` builder 
builder = Builder(action = '/usr/local/bin/knit $SOURCE -o $TARGET', 
        src_suffix='Rmd') 

# add builders as "Knit", "RMD" 
environment.Append(BUILDERS = {'Knit' : builder}) 

# define an `rmarkdown::render()` builder 
builder = Builder(action = '/usr/bin/Rscript -e "rmarkdown::render(input=\'$SOURCE\', output_file=\'$TARGET\')"', 
     src_suffix='Rmd') 

environment.Append(BUILDERS = {'RMD' : builder}) 

# define source (and target files -- currently useless, since not defined above!) 

# main cleaning session code 
environment.RMD(source='cleaning_session.Rmd', target='cleaning_session.html') 

# documentation of the Cleaning Process 
environment.Knit(source='Cleaning_Process.Rmd', target='Cleaning_Process.html') 

# documentation of data 
environment.Knit(source='Code_Book.Rmd', target='Code_Book.html') 
  • Die ersten Builder das benutzerdefinierte Skript knit genannt nennt. Das wiederum kümmert sich um die Zieldatei/Erweiterung, hier cleaning_session.html. Wahrscheinlich wird der suffix Parameter in diesem Beispiel nicht benötigt.

  • Der zweite Builder wurde hinzugefügt Rscript -e "rmarkdown::render(\'$SOURCE\')"'.

  • Die Existenz $TARGET s (wie im Beispiel bei Command wrapper) sorgt für SCons Arbeit nicht wiederholen wird, wenn eine Zieldatei existiert bereits.

Die benutzerdefinierten Skript (dessen Quelle ich kann momentan nicht abrufen) ist:

#!/usr/bin/env Rscript 

local({ 
    p = commandArgs(TRUE) 
    if (length(p) == 0L || any(c('-h', '--help') %in% p)) { 
    message('usage: knit input [input2 input3] [-n] [-o output output2 output3] 
    -h, --help  to print help messages 
    -n, --no-convert do not convert tex to pdf, markdown to html, etc 
    -o    output filename(s) for knit()') 
    q('no') 
    } 

    library(knitr) 
    o = match('-o', p) 
    if (is.na(o)) output = NA else { 
    output = tail(p, length(p) - o) 
    p = head(p, o - 1L) 
    } 
    nc = c('-n', '--no-convert') 
    knit_fun = if (any(nc %in% p)) { 
    p = setdiff(p, nc) 
    knit 
    } else { 
    if (length(p) == 0L) stop('no input file provided') 
    if (grepl('\\.(R|S)(nw|tex)$', p[1])) { 
     function(x, ...) knit2pdf(x, ..., clean = TRUE) 
    } else { 
     if (grepl('\\.R(md|markdown)$', p[1])) knit2html else knit 
    } 
    } 

    mapply(knit_fun, p, output = output, MoreArgs = list(envir = globalenv())) 
}) 

Das einzige, was jetzt ist notwendig scons zu laufen.