我已经阅读了很多关于SO的答案,但是仍然不能拼凑出当S3方法有不同的参数时,它们需要如何被文档化。我希望用户能够在一个列表中输入两个对象或管道。代码工作正常。它只是吐出一个关于方法一致性的警告。我我试过移动list
参数,但总是得到foo
!= foo.list
或foo
!= foo.default
的警告组合。在折叠的代码部分和结尾的相关链接中有一个虚拟的reprex。谢谢!
#' 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帖子:
2条答案
按热度按时间fhity93d1#
我不确定我会在这里使用S3。不回答你的具体问题,但考虑这样的事情。当然,如果你的实际用例离你的例子足够远,这是无关紧要的。
所以现在你可以得到你想要的行为,只需要将
x
作为一个参数列表或第一个参数记录下来。否则,你会创建一些烦人的东西,比如要求用户每次都显式地命名参数。如果必须的话,你可以用S3来完成同样的事情,但无论哪种方式,你可能只想给参数起同样的名字,并记录它有两种含义。
一个例子是base中的
plot
函数。或者,可以提供单个绘图结构、函数或具有绘图方法的任何R对象。
y绘图中点的y坐标,如果x是适当的结构,则为可选。
这里,
x
是x坐标 * 或 * 一个有效的绘图结构。然后y
仅在需要时使用。hgc7kmma2#
正如@MrFlick提到的,如果你想要一个根据参数数量进行调度的S3方法,这是不可能做到的。我不确定你希望IntelliSense如何显示参数,但也许你可以从一个参数开始?