对于我正在设计的R包,我想以编程方式在For循环中定义一组函数。例如,我可能想要做一些事情,比如创建总是忽略NA值的基函数的新版本。像这样:
for(f in c('mean', 'sd', 'median', 'quantile', 'max', 'min', 'range')) {
cur = function() {}
formals(cur) = formals(args(get(f)))
body(cur) = parse(text = paste0(f,
'(',
names(formals(cur))[1],
', na.rm = TRUE)'))
assign(paste0(f, 'x'), cur)
}这段代码创建了七个新函数(meanx、sdx、medianx、quantilex等)。它们只是调用它们的同名函数(均值、标准差、中位数、分位数等)。当na.rm = TRUE时。
我的问题是:我如何使用roxygen来记录这七个函数?至少,我想@导出它们,但是如果我在循环中放入一个#' @export行,roxygen不会对它做任何事情。显然,我可以自己将名称写入名称空间文件,但如果我再次使用roxygen,它将覆盖我所做的更改。
有什么想法吗?
(为了清楚起见,这只是一个说明性的例子。这七个函数并不是我真正定义的函数,所以我并不是在寻求关于如何自动使用na.rm或任何东西的建议。我感兴趣的是如何让roxygen导出函数在循环中定义到名称空间文件中。)
发布于 2017-04-18 05:25:06
我相信我已经找到了解决我自己问题的方法!在发布这个问题之前,我应该更彻底地阅读roxygen文档。
事实证明,您可以将多个名称(以空格分隔)提供给单个#' @export命令:#' @export func1 func2 func3等。
所以我原来的问题可以这样解决:
for(f in c('mean', 'sd', 'median', 'quantile', 'max', 'min', 'range')) {
cur = function() {}
formals(cur) = formals(args(get(f)))
body(cur) = parse(text = paste0(f,
'(',
names(formals(cur))[1],
', na.rm = TRUE)'))
assign(paste0(f, 'x'), cur)
}
#' @export meanx sdx medianx quantilex maxx minx rangex
NULL(我非常确定#' @export行后面的NULL是必需的。)
唯一的问题是,当我在Rstudio中构建包时,它会给出一个警告,因为它认为正在导出的东西并不存在。我还不知道加载我的包的用户是否会看到这个警告。
发布于 2017-04-18 00:54:28
如果这是你想要做的,我认为你不能很容易地使用循环。除非您在构建脚本中使用循环来写出函数和roxygen代码。也就是说,如果您为每个函数手动执行此操作,则会有大量重复的代码。所以你可以做的是创建一个函数,它接受一个函数作为输入,并返回一个函数作为它的输出。如果你想了解更多,在这里你会感兴趣的搜索词是“闭包”。下面是ggplot2 codebase (GPL-2)中的一个示例:
wrap_hmisc <- function(fun) {
function(x, ...) {
if (!requireNamespace("Hmisc", quietly = TRUE))
stop("Hmisc package required for this function", call. = FALSE)
fun <- getExportedValue("Hmisc", fun)
result <- do.call(fun, list(x = quote(x), ...))
plyr::rename(
data.frame(t(result)),
c(Median = "y", Mean = "y", Lower = "ymin", Upper = "ymax"),
warn_missing = FALSE
)
}
}
#' @export
#' @rdname hmisc
mean_cl_boot <- wrap_hmisc("smean.cl.boot")
#' @export
#' @rdname hmisc
mean_cl_normal <- wrap_hmisc("smean.cl.normal")
#' @export
#' @rdname hmisc
mean_sdl <- wrap_hmisc("smean.sdl")
#' @export
#' @rdname hmisc
median_hilow <- wrap_hmisc("smedian.hilow")基本上,您创建了一个返回函数的函数,然后您可以使用该函数手动遍历要修改的所有函数,并添加相关的roxygen文档。我看不到手动创建和手动编写roxygen文档的方法,除非你想要一个构建脚本来帮你解决这个问题。
https://stackoverflow.com/questions/43455431
复制相似问题