我已经阅读了几个SO答案,但仍然无法拼凑出S3方法在具有不同参数时需要如何记录文档的方式。在下面的示例中,我希望用户能够输入两个对象或将它们作为列表传入。代码运行良好,只是会输出关于方法一致性的警告。我尝试移动list
参数,但总是得到一些警告的组合,要么是foo != foo.list
,要么是foo != foo.default
。在折叠的代码部分中有一个虚拟重现,并在结尾处提供相关链接。谢谢!
#' does some stuff
#' @param list for list methods
#' @param x arg1
#' @param y arg2
#' @param ... some argument
#' @export
foo <- function(list, x, y, ...) UseMethod('foo')
#' @export
foo.default <- function(x, y, ...) paste(x, y, ...)
#' do stuff for lists
#' @export
#' @param list for list methods
#' @inheritParams foo
foo.list <- function(list, x, y, ...) foo(list[[x]], list[[y]])
# create dummy package
tmp <- tempdir()
setwd(tmp)
devtools::create(path = "test")
setwd("test")
usethis::use_mit_license()
# add R code
writeLines(
con = "R/test.R",
text =
"#' does some stuff
#' @param list for list methods
#' @param x arg1
#' @param y arg2
#' @param ... some argument
#' @export
foo <- function(list, x, y, ...) UseMethod('foo')
#' @export
foo.default <- function(x, y, ...) paste(x, y, ...)
#' do stuff for lists
#' @export
#' @param list for list methods
#' @inheritParams foo
foo.list <- function(list, x, y, ...) foo(list[[x]], list[[y]])"
)
devtools::document()
devtools::load_all()
# examples
foo(1, 2)
list(a = 1, b = 2) |> foo("a", "b")
# check
devtools::check(document = FALSE)
W checking S3 generic/method consistency (561ms)
foo:
function(list, x, y, ...)
foo.default:
function(x, y, ...)
See section 'Generic functions and methods' in the 'Writing R
Extensions' manual.
以下是一些相关的SO帖子:
class()
。你似乎想要根据参数数量进行分发,但S3无法做到。所有的foo
函数需要与通用版本具有相同的参数,直到...
为止。它们可以在之后拥有不同的参数。 - MrFlick...
的事情。我遇到的问题是在RStudio中无法显示帮助信息。如果我只在通用函数中放置...
,那么函数可以正常工作,但是它不会通过IntelliSense(自动完成)显示任何内容。用户通常会传递单个值x
,然后将其与y
组合,但是如果用户输入列表,则希望函数从列表中获取值。最好的方法是如何记录此信息以便IntelliSense能够识别? - yake84