问题
Since roxygen2
version 4.0.0
, the @S3method
tag has been deprecated in favour of using @export
.
The package now tries to detect if a function is an S3 method, and automatically adds the line S3method(function,class)
to the NAMESPACE
file if it think it is one.
The problem is that if a function is not an S3 method but its name contains a .
then roxygen sometimes makes a mistake and adds the line when it shouldn't.
Is there a way to tell roxygen that a function is not an S3 method?
As requested, here's a reproducible example.
I have a package that imports R.oo
, with a function named 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")
Now the namespace contains the line S3method(check,arg)
.
check
is an S3 generic in R.oo
, so roxygen is trying to be smart and guessing that I want check.arg
to be an S3 method. Unfortunately, these functions are unrelated, so I don't.
(To preempt suggestions that I just rename check.arg
: this is legacy code written by others, and I've created a checkArg
replacement, but I need to leave check.arg
as a deprecated function for compatibility.)
回答1:
As Mr Flick commented, appending the full function name to the roxygen line works correctly. If I change the line to:
#' @export check.arg
then the NAMESPACE
file contains:
export(check.arg)
回答2:
Use @method generic class
and @export
instead of @S3method
. Take a look at this thread:
S3 method help (roxygen2)
来源:https://stackoverflow.com/questions/24594507/exporting-non-s3-methods-with-dots-in-the-name-using-roxygen2-v4