【问题标题】:checking S3 generic/method consistency ... WARNING检查 S3 泛型/方法一致性...警告
【发布时间】:2018-03-07 05:24:00
【问题描述】:

我已经阅读了以下两个讨论:
Roxygen2 - how to properly document S3 methods
S3 method consistency warning when building R package with Roxygen
以及以下两个教程:
http://cran.r-project.org/doc/manuals/R-exts.html#Generic-functions-and-methods
http://adv-r.had.co.nz/S3.html,
但我的问题仍然没有解决。以下是详细信息:
我想在一个包中定义一个 plot() 泛型的 S3 方法,我的代码是:

#' description
#'
#' more details
#'
#' @param x "test" object
#' @param label parameter one
#' @param log parameter two
#' @param ... graphical parameters to plot
#'
#' @examples
#' plot(a)
#'
#' @export
plot <- function(x, label=TRUE, log=TRUE,  ...){
  UseMethod("plot")
}

#' @export
plot.test <- function(x, label=TRUE, log=TRUE, ...){
# some code
}

运行devtools::check()后,我会收到以下警告:

checking S3 generic/method consistency ... WARNING
plot:
  function(x, log, ...)
plot.test:
  function(x, label, log, ...)

See section ‘Generic functions and methods’ in the ‘Writing R
Extensions’ manual.

好像参数label消失了,我尝试交换参数loglabel的位置,x后面的任何参数都会在function(x, log, ...)行中消失,请问如何解决?

【问题讨论】:

    标签: r object roxygen2 r-s3


    【解决方案1】:

    您是使用plot() 泛型函数作为示例还是实际上是您的代码?

    如果是后者,我认为这是因为plot() 是一个带有三个参数的基本 R 函数:x、y 和 ...。要让您自己的 s3 方法通过检查,无需重新定义您自己的泛型,而且您的 s3 方法必须遵循与基本 R 泛型完全相同的参数。

    【讨论】:

    • 感谢您指出这一点。 plot() 泛型函数是我想要添加方法的实际函数。所以你的意思是我不能向我的函数plot.test()添加任何新参数?
    • 可以,但您应该首先包含泛型中的所有参数。在您的情况下:plot.test &lt;- function(x, y, ..., label = TRUE, log = TRUE) { 或者如果您想允许在位置上指定 labellogplot.test &lt;- function(x, y, label = TRUE, log = TRUE, ...) {。但是请注意,即使是图形包也不坚持这一点(在 plot.formula 中) - 似乎通用绘图并不像它使用的那样通用。
    【解决方案2】:

    当我使用 s3 方法对我的包运行 R CMD checkdevtools:check() 时遇到了同样的问题,由于 S3 泛型/方法的一致性,它总是给我警告。

    我也使用 Roxygen2,我尝试在 @export 之前使用 s3 generic 将 @rdname 添加到我的函数中,它对我有用。请尝试以下代码:

    ##---- You can remove this---###
    #plot <- function(x, label=TRUE, log=TRUE,  ...){
    #  UseMethod("plot")
    #}
    #######################################
    
    #' description
    #'
    #' more details
    #'
    #' @param x "test" object
    #' @param label parameter one
    #' @param log parameter two
    #' @param ... graphical parameters to plot
    #'
    #' @examples
    #' plot(a)
    #' @rdname plot.test
    #' @export
    plot.test <- function(x, label=TRUE, log=TRUE, ...){
    # some code
    }
    

    您可以删除第一个函数(使用 UseMethod('plot') 绘图)。

    让我知道警告是否消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多