【问题标题】:Exporting non-S3-methods with dots in the name using roxygen2 v4使用 roxygen2 v4 导出名称中带有点的非 S3 方法
【发布时间】:2014-08-26 23:39:54
【问题描述】:

自roxygen2 版本4.0.0 起,@S3method 标记已被弃用,取而代之的是使用@export。

包现在尝试检测一个函数是否是一个 S3 方法,如果它认为是一个,则自动将 S3method(function,class) 行添加到 NAMESPACE 文件中。

问题在于,如果一个函数不是 S3 方法,但它的名称包含 .,那么 roxygen 有时会出错并在不应该添加的行中添加该行。

有没有办法告诉 roxygen 一个函数不是 S3 方法?


根据要求,这是一个可重现的示例。

我有一个导入 R.oo 的包,其中包含一个名为 check.arg 的函数。

library(roxygen2)
package.skeleton("test")
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE)
writeLines(
  "#' Check an argument 
#' 
#' Checks an argument.
#' @param ... Some arguments.
#' @return A value.
#' @export
check.arg <- function(...) 0",
  "test/R/check.arg.R"
)
roxygenise("test")

现在命名空间包含S3method(check,arg)这一行。

check 是R.oo 中的 S3 泛型,因此 roxygen 试图变得聪明并猜测我希望 check.arg 成为 S3 方法。不幸的是,这些功能是不相关的,所以我不知道。

(为了抢占我只是重命名 check.arg 的建议:这是其他人编写的遗留代码,我创建了一个 checkArg 替换,但我需要将 check.arg 作为不推荐使用的函数保留为兼容性。)

【问题讨论】:

  • 相信你只要用@export加上函数的全名就行了。包含reproducible example 进行测试会很有帮助。
  • @MrFlick 感谢您的解决方案,感谢您提醒我不要偷懒。

标签: r roxygen2


【解决方案1】:

正如 Flick 先生所说,将完整的函数名称附加到 roxygen 行可以正常工作。如果我将行更改为:

#' @export check.arg

那么NAMESPACE 文件包含:

export(check.arg)

【讨论】:

  • 另一个需要注意的问题是使用声明,除非你修复它,否则它将显示## S3 method for class ’check’\n check(...)。一种方法是只添加一个##' @usage check.arg(x) 指令,不确定是否有更好的方法。
  • 请注意上述解决方案将使您在NAMESPACE 文件中获得正确的条目。但是,要正确获取函数记录,您还需要添加@usage 标记,否则消息## S3 method for class 'arg' 将出现在.Rd 文件中函数签名的正上方,并且帮助文件中的签名将是 check(...) 而不是 check.arg(...)。
  • @Jthorpe 很好的说明(值得回答!)。 R CMD check 可能仍会抱怨类似 发现以下明显的 S3 方法已导出但未注册: 并且您必须重命名该函数,然后才能在 CRAN 成功提交(它们不允许警告)。
【解决方案2】:

使用@method generic class 和@export 代替@S3method。看看这个线程: S3 method help (roxygen2)

【讨论】:

  • 这个问题不是关于如何记录 S3 方法;这是关于记录不是 S3 方法的事物的相反问题(但 roxygen 认为它们是)。
猜你喜欢
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2021-03-05
相关资源
最近更新 更多