Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环中的roxygen@export函数_R_Roxygen2_R Package - Fatal编程技术网

循环中的roxygen@export函数

循环中的roxygen@export函数,r,roxygen2,r-package,R,Roxygen2,R Package,对于我正在设计的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,

对于我正在设计的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调用它们的同名函数(mean、sd、median、quantile等)

我的问题是:如何使用roxygen来记录这七个函数?至少,我想@export他们,但是如果我把
#@export
行放入循环中,roxygen不会对它做任何事情。显然,我可以自己将名称写入名称空间文件,但如果我再次使用roxygen,它将覆盖我的更改

有什么想法吗


(需要明确的是,这只是一个说明性的例子。这七个函数并不是我真正定义的函数,所以我不是在寻找关于如何自动使用na.rm或任何东西的建议。我感兴趣的是如何让roxygen将在循环中定义的函数导出到名称空间文件中。)

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


wrap\u hmisc我相信我已经找到了解决我自己问题的方法!在发布问题之前,我应该更彻底地浏览一下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中构建包时,它会发出警告,因为它认为正在导出不存在的东西。我还不知道加载我的软件包的用户是否可以看到此警告。

这还不是答案,但文档包将帮助缓解此问题。这是R文档工作组的工作,将有助于导出动态生成的函数。在2017年7月R用户大会上应该准备好了。谢谢@Andrew,我期待着查看该软件包!谢谢@Dason。实际上,我已经在做一些与您的解决方案类似的事情(使用闭包),但是您的版本稍微整洁了一点。谢谢我真的希望避免一次又一次地写出#'\@导出…但似乎没有办法解决它(同时仍然使用roxygen)。
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