【发布时间】:2021-10-12 02:01:28
【问题描述】:
我已经阅读了几个 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 帖子:
【问题讨论】:
-
目前尚不清楚您要在这里实现什么行为。 S3 调度仅适用于第一个参数的
class()。您似乎想根据 S3 无法执行的参数数量进行调度。您的所有foo函数都需要具有与通用版本相同的参数,直到...。之后它们可以有不同的参数。 -
谢谢,我不知道
...我遇到的问题是在 RStudio 中获得帮助。如果我只将...放在泛型中,则功能可以正常工作,但不会通过 IntelliSense(自动完成)显示任何内容。用户通常会传递单个值x,然后将其与y组合,但如果用户在列表中使用管道,我希望函数从列表中获取值。记录此内容以便 IntelliSense 识别的最佳方法是什么?