使用knitr,在将块释放到单独的文件中时保留块选项

时间:2016-03-07 22:57:54

标签: r knitr rnw

出于教学目的,我希望将purl文件的.Rnw块放入单独的文件中。这个答案解释了如何做到这一点:

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

但该方法不保留块选项。由于我已经生成了块,因此保留fig.widthfig.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.widthfig.height转换为spin()可识别的格式,如purl()那样,并删除块选项与spin()无关,或out.width在Word中造成问题,例如string MY_DEFAULT_VALUE = 'Pick One:'; string queryString = "SELECT * FROM my_table"; //Populate Dictionary: Dictionary<string,ComboBox > columnDictionary= new Dictionary<string, ComboBox>(); columnDictionary.Add("COL_A", comboBox1); columnDictionary.Add("COL_B", comboBox2); columnDictionary.Add("COL_C", comboBox3); //etc... List<KeyValuePair<string, ComboBox>> appendedColumns = new List<KeyValuePair<string, ComboBox>>(); foreach (KeyValuePair<string, ComboBox> entry in columnDictionary) { if (!String.Equals(entry.Value.Text, MY_DEFAULT_VALUE, StringComparison.OrdinalIgnoreCase)) { string currentColumnName = entry.Key; string currentColumnParameter = "@" + entry.Key; if (appendedColumns.Count>1) { queryString += " AND "; } else { queryString += " WHERE "; } queryString += currentColumnName + " = " + currentColumnParameter; appendedColumns.Add(entry); } } cmd.CommandText = queryString; if (appendedColumns.Count > 0) { foreach (KeyValuePair<string, ComboBox> entry in appendedColumns) { string currentColumnParameter = "@" + entry.Key; string currentParameterValue = entry.Value.Text; cmd.Parameters.AddWithValue(currentColumnParameter, currentParameterValue); } } //Continue on your way... 。所有这些都是为了创建用户友好的代码文件。

1 个答案:

答案 0 :(得分:1)

由于您所指的答案并未从purl的结果中复制标题行,因此除了块名称之外,您将丢失所有内容。虽然您可以调整它以粘贴标题,但实际上并不难构建解析purl输出的函数 - 比尝试解析Rmd或{{1}要容易得多无论如何,文件都比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的{​​{1}}参数的默认设置(1L)。 purl不会有块头,因此无论如何都是无意义的,但它会处理documentation(其中包括文本块作为0L注释)愚蠢。但是,如果你想要带有以下代码块的文本块,它可以重建。
  • 虽然2L的输出标题行看起来与上面的示例完全相同(它们以roxygen开头并且用连字符填充),但它们purl正确;结果服从块选项。