2016-08-04 40 views
0

是否有使用SConsknitr.Rmd文件生成報告的最小或甚至更大的工作示例?與knitr一起使用SCons的示例

knit荷蘭國際集團的命令行(bash殼),以導出.html文件的cleaning_session.Rmd文件,可通過來完成:

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

在這種example,RSCRIPT和指令被饋送到Make文件:

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='' 

在這個回答https://stackoverflow.com/a/10945832/1172302,據說有一個使用SCons的解決方案。然而,我沒有做足夠的測試來爲我工作。從本質上來說,擁有類似於https://tex.stackexchange.com/a/26573/8272中提供的示例的東西真是太棒了。

+1

您能否給我們一個提示,如何將'.Rmd'文件轉換爲TeX/LaTeX的命令看起來像?然後,您只需按照https://bitbucket.org/scons/scons/wiki/ToolsForFools的建議將此命令轉換爲「Command」或適當的Builder,然後將創建的TeX文件稱爲來源到PDF生成器。然後SCONS應該照顧其餘的...... – dirkbaechle

+0

@dirkbaechle感謝您指出正確的文檔。最後,我會嘗試構建更詳盡的內容。 –

回答

1

[更新一個工作示例是Sconstruct文件:

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') 
  • 第一建設者調用名爲knit自定義腳本。其中,反過來,照顧目標文件/擴展名,這裏是cleaning_session.html。在這個例子中,可能完全不需要suffix參數。

  • 第二個建造者加入的是Rscript -e "rmarkdown::render(\'$SOURCE\')"'

  • $TARGET s的存在(如在Command wrapper的示例中)確保SCons在目標文件已存在的情況下不會重複工作。

自定義腳本(其源我目前不能檢索)是:

#!/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())) 
}) 

唯一的事情,現在,必要的是運行scons

相關問題