2

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

如何使用 Knitr 将 .Rmd 文件中的每个块压缩到多个 .R 文件

但是该方法不保留块选项。由于我已经生成了图块,因此保留fig.widthandfig.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()out.width

4

1 回答 1

1

由于您引用的答案不会从 的结果中复制标题行purl,因此您会丢失除块名称之外的所有内容。虽然您可以调整它以粘贴到标题中,但实际上构建一个解析输出的函数并不难——无论如何,purl这比尝试解析一个RmdRnw文档要容易得多,而且比准确地整理出如何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相同,它适用于任何一个。
  • 它对's参数使用默认设置 ( 1L) 。不会有块标题,因此无论如何在这里毫无意义,但它会愚蠢地处理(包括文本块作为注释)。但是,如果您想要具有以下代码块的文本块,则可以为此重建它。purldocumentation0L2Lroxygen
  • 虽然输出标题行purl看起来与上面的示例不完全相同(它们以连字符开头## ----并用连字符填充),但它们是spin正确的;结果服从块选项。
于 2016-03-08T09:42:38.050 回答