R CMD使用名称中点的点检查非S3方法,其中点之前的名称部分与utils中的泛型一致

时间:2016-12-08 19:08:28

标签: r-package cran roxygen2 r-s3

此问题与Exporting non-S3-methods with dots in the name using roxygen2 v4有所不同。从那篇文章中我了解到需要使用@export function.name才能通过roxygen正确地编写NAMESPACE。我已经做到了,NAMESPACE写得正确。

当我进行R CMD检查时出现问题。我有遗留代码,其函数为tail.g()。 R CMD Check抛出一个注意,注意到已导出明显的S3方法但未注册。

下面是一个可重现的例子。注意xxxx.g没有NOTE,这让我相信因为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()的注释?

1 个答案:

答案 0 :(得分:1)

这是一个肮脏的黑客,但它有效:只是将函数注册为方法,除了导出

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

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

这似乎足以消除警告并获得干净的CRAN提交。我可以想到的普通用户唯一的负面影响是methods(class="g")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"
)