首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >roxygen @export函数循环

roxygen @export函数循环
EN

Stack Overflow用户
提问于 2017-04-18 00:31:24
回答 2查看 217关注 0票数 1

对于我正在设计的R包,我想以编程方式在For循环中定义一组函数。例如,我可能想要做一些事情,比如创建总是忽略NA值的基函数的新版本。像这样:

代码语言:javascript
复制
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导出函数在循环中定义到名称空间文件中。)

EN

回答 2

Stack Overflow用户

发布于 2017-04-18 05:25:06

我相信我已经找到了解决我自己问题的方法!在发布这个问题之前,我应该更彻底地阅读roxygen文档。

事实证明,您可以将多个名称(以空格分隔)提供给单个#' @export命令:#' @export func1 func2 func3等。

所以我原来的问题可以这样解决:

代码语言:javascript
复制
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中构建包时,它会给出一个警告,因为它认为正在导出的东西并不存在。我还不知道加载我的包的用户是否会看到这个警告。

票数 1
EN

Stack Overflow用户

发布于 2017-04-18 00:54:28

如果这是你想要做的,我认为你不能很容易地使用循环。除非您在构建脚本中使用循环来写出函数和roxygen代码。也就是说,如果您为每个函数手动执行此操作,则会有大量重复的代码。所以你可以做的是创建一个函数,它接受一个函数作为输入,并返回一个函数作为它的输出。如果你想了解更多,在这里你会感兴趣的搜索词是“闭包”。下面是ggplot2 codebase (GPL-2)中的一个示例:

代码语言:javascript
复制
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文档的方法,除非你想要一个构建脚本来帮你解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43455431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档