2016-08-04 2 views
0

Существуют ли минимальные или даже более крупные рабочие примеры использования SCons и knitr для создания отчетов от .Rmd файлов?Примеры использования SCons с knitr

knit ING в cleaning_session.Rmd файл из командной строки (bash оболочки), чтобы вывести .html файл, может быть сделано с помощью:

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? Затем все, что вам нужно сделать, это преобразовать эту команду в команду «Command» или соответствующий Builder, следуя рекомендациям https://bitbucket.org/scons/scons/wiki/ToolsForFools, а затем обратиться к созданному файлу TeX как к источник для PDF-редактора. Затем Школьники должны позаботиться об остальном ... – 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 с (как в примере на 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.

Смежные вопросы