4

这个问题与Exporting non-S3-methods with dots using roxygen2 v4相关但不同。从那篇文章中,我了解到需要使用@export function.nameNAMESPACE 才能由 roxygen 正确写入。我已经这样做了,并且正确编写了 NAMESPACE。

当我执行 R CMD Check 时,我的问题就来了。我有具有功能的遗留代码tail.g()。R CMD Check 抛出一个注释,指出一个明显的 S3 方法已被导出但未注册。

下面是一个可重现的示例。观察它xxxx.g没有注释,这让我相信,因为tail它是 utils 包中的泛型,所以我需要一些特殊的解决方法。我不希望将 tail.g 重命名为 tail_g,因为这是遗留代码。我希望消除成功提交 CRAN 的所有注释。

library(roxygen2)
package.skeleton("test")
writeLines(
  "#' Check an argument 
  #' 
  #' Checks an argument.
  #' @param ... Some arguments.
  #' @return A value.
  #' @export tail.g
  tail.g <- function(...) 0",
  "test/R/tail.g.R"
)
writeLines(
  "#' Check an argument 
  #' 
  #' Checks an argument.
  #' @param ... Some arguments.
  #' @return A value.
  #' @export xxxx.g
  xxxx.g <- function(...) 0",
  "test/R/xxxx.g.R"
)
roxygenise("test")
setwd("./test")
devtools::check(document=FALSE)

给出注释:

checking S3 generic/method consistency ... NOTE
Found the following apparent S3 methods exported but not registered:
  tail.g

如何在不重命名的情况下消除 tail.g() 的注释?

4

1 回答 1

1

这是一个肮脏的技巧,但它有效:除了export之外,只需将函数注册为方法

所以你NAMESPACE可以有两行这样的:

export(tail.g)
S3method(tail, g)

这似乎足以消除警告并获得干净的 CRAN 提交。对于普通用户,我能想到的唯一负面影响是输出中的一些虚假条目,例如methods(class="g")or methods("tail")。大多数普通用户甚至不应该注意到。

使用 roxygen2,您可以使用@rawNamespace标签在文件中包含所需的S3method指令NAMESPACE

writeLines(
  "#' Check an argument 
  #' 
  #' Checks an argument.
  #' @param ... Some arguments.
  #' @return A value.
  #' @export tail.g
  #' @rawNamespace S3method(tail, g)
  tail.g <- function(...) 0",
  "test/R/tail.g.R"
)
于 2018-03-25T14:59:59.160 回答