r - S3 generic/method 需要不同参数时的一致性
r - S3 generic/method consistency when different arguments needed
我已经阅读了几个 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 帖子:
- Explanation for "checking S3 generic/method consistency ... WARNING"
- S3 method consistency warning when building R package with Roxygen
- checking S3 generic/method consistency ... WARNING
正如@MrFlick 提到的,如果您想要一个根据参数数量进行分派的 S3 方法,这是无法做到的。我不确定您希望 IntelliSense 如何显示参数,但也许您可以只从一个参数开始?
#' does some stuff
#' @param x argument 1, could be a list
#' @param \dots Further arguments passed to each method
#' @export
foo <- function(x, ...) UseMethod('foo', x)
#' @export
foo.default <- function(x, ...) paste(x, ...)
#' do stuff for lists
#' @export
#' @inheritParams foo
#' @param a an element of x
#' @param b another element of x
foo.list <- function(x, a, b, ...) foo(x[[a]], x[[b]])
我不确定我会在这里使用 S3。不回答您的具体问题,但考虑这样的事情。当然,如果您的实际用例与您的示例相距足够远,则这无关紧要。
foo <- function(x, y) {
if (is.list(x)) return(do.call(foo, x))
paste(x, y)
}
现在您可以获得所需的行为,只需将 x
记录为参数列表或第一个参数。否则,您将创建一些烦人的事情,例如要求用户每次都显式命名参数。
foo("a", "b")
# [1] "a b"
foo(list(x = "a", y = "b"))
# [1] "a b"
foo(list(y = "a", x = "b"))
# [1] "b a"
foo("a", "b", z = "c")
# Error in foo("a", "b", z = "c") : unused argument (z = "c")
foo(list("a", "b", z = "c"))
# Error in (function (x, y) : unused argument (z = "c")
如果迫不得已,您可以使用 S3 完成同样的事情。但无论哪种方式,您可能只想将参数命名为相同的东西并将其记录为具有两种含义。
foo <- function(x, y, ...) UseMethod('foo')
foo.default <- function(x, y, ...) paste(x, y)
foo.list <- function(x, y, ...) do.call(foo, x)
一个例子是 base 中的 plot
函数。
x
the coordinates of points in the plot. Alternatively, a single plotting structure, function or any R object with a plot method can be provided.
y
the y coordinates of points in the plot, optional if x is an appropriate structure.
此处,x
是 x 坐标 或 有效的绘图结构。然后 y
仅在需要时使用。
我已经阅读了几个 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 帖子:
- Explanation for "checking S3 generic/method consistency ... WARNING"
- S3 method consistency warning when building R package with Roxygen
- checking S3 generic/method consistency ... WARNING
正如@MrFlick 提到的,如果您想要一个根据参数数量进行分派的 S3 方法,这是无法做到的。我不确定您希望 IntelliSense 如何显示参数,但也许您可以只从一个参数开始?
#' does some stuff
#' @param x argument 1, could be a list
#' @param \dots Further arguments passed to each method
#' @export
foo <- function(x, ...) UseMethod('foo', x)
#' @export
foo.default <- function(x, ...) paste(x, ...)
#' do stuff for lists
#' @export
#' @inheritParams foo
#' @param a an element of x
#' @param b another element of x
foo.list <- function(x, a, b, ...) foo(x[[a]], x[[b]])
我不确定我会在这里使用 S3。不回答您的具体问题,但考虑这样的事情。当然,如果您的实际用例与您的示例相距足够远,则这无关紧要。
foo <- function(x, y) {
if (is.list(x)) return(do.call(foo, x))
paste(x, y)
}
现在您可以获得所需的行为,只需将 x
记录为参数列表或第一个参数。否则,您将创建一些烦人的事情,例如要求用户每次都显式命名参数。
foo("a", "b")
# [1] "a b"
foo(list(x = "a", y = "b"))
# [1] "a b"
foo(list(y = "a", x = "b"))
# [1] "b a"
foo("a", "b", z = "c")
# Error in foo("a", "b", z = "c") : unused argument (z = "c")
foo(list("a", "b", z = "c"))
# Error in (function (x, y) : unused argument (z = "c")
如果迫不得已,您可以使用 S3 完成同样的事情。但无论哪种方式,您可能只想将参数命名为相同的东西并将其记录为具有两种含义。
foo <- function(x, y, ...) UseMethod('foo')
foo.default <- function(x, y, ...) paste(x, y)
foo.list <- function(x, y, ...) do.call(foo, x)
一个例子是 base 中的 plot
函数。
x the coordinates of points in the plot. Alternatively, a single plotting structure, function or any R object with a plot method can be provided.
y the y coordinates of points in the plot, optional if x is an appropriate structure.
此处,x
是 x 坐标 或 有效的绘图结构。然后 y
仅在需要时使用。