这是从@Konrad Rudolph 的代码包装的通用函数,可用于为指定文件夹下的 R 脚本生成 .Rd 文件。对于使用具有“非标准”文件夹结构的模块包的项目,这可以是一种无需创建已安装包的文档解决方案。
moxygenise <- function(codepath, manpath) {
apply_at_level <- function(l, f, n, ...) {
## function to apply a function at specified level of a nested list
if (n < 0) {
stop("Invalid parameter - n should be integer >= 0 -- APPLY_AT_LEVEL")
} else if (n==0) {
return(l)
} else if (n == 1) {
return(lapply(l, f, ...))
} else {
return(lapply(l, function(x) {apply_at_level(x, f, n-1)}))
}
}
list.files.paths <- function(path, pattern) {
## function to list absolute path of all files under specified path matching certain pattern
path <- normalizePath(path)
return(file.path(path, list.files(path=path, pattern=pattern)))
}
sourcefiles <- list.files.paths(codepath, "\\.R$")
source_envs <- lapply(sourcefiles, roxygen2::env_file)
rd_blockss <- mapply(roxygen2::parse_file, sourcefiles, source_envs)
help_topicss <- mapply(function(rdblock, sourceenv, sourcefile) {
return(roxygen2::roclet_process(
roxygen2::rd_roclet(),
rdblock, sourceenv,
dirname(sourcefile)))},
rd_blockss, source_envs, sourcefiles)
rd_codes <- purrr::flatten(apply_at_level(help_topicss, format, 2))
mapply(function(text, topic, outpath=manpath) {
cat("Write", topic, "to", outpath, "\n")
write(text, file=file.path(outpath, topic))
}, rd_codes, names(rd_codes))
return(NULL)
}
指定保存模块源文件的路径以及要生成 .Rd 文件的路径(应该是 projecthome/man/,如果您希望帮助功能与您的源包一起使用)
moxygenise('path/of/module/source/', 'path/of/output.Rds')