2016-03-07 6 views
1

Для учебных целей я хотел бы purl куски моего .Rnw файла в отдельные файлы. Этот ответ объясняет, как это сделать:С knitr, сохраните опции chunk при сборке кусков в отдельные файлы

How to purl each chunks in .Rmd file to multiple .R files using Knitr

но метод не сохраняет параметры порций. Поскольку куски у меня производят участки, важно сохранить опции и fig.height. В идеале я хотел бы кусок, который выглядит следующим образом:

<<plot, fig.width = 3, fig.height = 5, outwidth = '.75\\textwidth'>>= 
plot (1,1) 
@ 

стать файл с именем plot.R, который выглядит следующим образом:

#+ fig.width = 3, fig.height = 5 
plot (1,1) 

То есть, включить параметры порций fig.width и fig.height в формат, будет признана spin(), так как purl() делает и избавляется от неаккуратных опций пакета или создает проблемы для spin() в Word, например out.width. Все в духе создания файлов кода, которые являются удобными для пользователя.

ответ

1

Поскольку ответ, на который вы ссылаетесь, не копирует строку заголовка из результатов purl, вы теряете все, кроме имени фрагмента. В то время как вы можете адаптировать его для вставки в заголовки, на самом деле нетрудно построить функцию для анализа вывода purl - намного проще, чем пытаться разобрать документ или Rnw, и все же проще, чем сортировать именно так, как это делает knitr ,

purl_chunks <- function(input_file){ 
    purled <- knitr::purl(input_file) # purl original file; save name to variable 
    lines <- readLines(purled) # read purled file into a character vector of lines 
    starts <- grep('^## ----.*-+', lines) # use grep to find header row indices 
    stops <- c(starts[-1] - 1L, length(lines)) # end row indices 
    # extract chunk names from headers 
    names <- sub('^## ----([^-]([^,=]*[^,=-])*)[,-][^=].*', '\\1', lines[starts]) 
    names <- ifelse(names == lines[starts], '', paste0('_', names)) # clean if no chunk name 
    # make nice file names with chunk number and name (if exists) 
    file_names <- paste0('chunk_', seq_along(starts), names, '.R') 
    for(chunk in seq_along(starts)){ # loop over header rows 
    # save the lines in the chunk to a file 
    writeLines(lines[starts[chunk]:stops[chunk]], con = file_names[chunk]) 
    } 
    unlink(purled) # delete purled file of entire document 
} 

Пара отмечает:

  • Хотя регулярное выражение работает для того, что я бросил на нее, она все же может быть ошибочной. Проверено:
    • нет имени ломтя
    • нет имени, но кусок не настройки
    • имени с дефисом
    • одиночных именами персонажей
    • имен с пробелами, в том числе после (до запятой/скобки)
  • Как .Rnw и .Rmd файлы оба purl то же самое, он работает для обоих.
  • Используется значение по умолчанию (1L) для параметра purldocumentation. 0L не имел бы заголовков блоков и, таким образом, бессмысленны здесь, но он будет обрабатывать 2L (который будет включать текстовые фрагменты как roxygen комментариев) глупо. Его можно было бы перестроить для такого, хотя, если бы вам нужны куски текста со следующим фрагментом кода.
  • Хотя выходные строки заголовка purl не выглядят точно так же, как ваш пример выше (они начинаются с ## ---- и заполняются дефисами), они spin правильно; результаты подчиняются вариантам chunk.
+1

Удивительно, работает как шарм. Бесконечно благодарен. Это то, чего я хочу, чтобы я знал, как это сделать ... Я буду изучать и учиться. – jtr13

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

  • Нет связанных вопросов^_^