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