【发布时间】: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 感谢您的解决方案,感谢您提醒我不要偷懒。