有“缺少”参数的“[”的S4文档

这个问题与这个问题非常相似,但是当我尝试答案时,我在R CMD check收到一个附加'NOTE'。 虽然它只是一个NOTE我真的很想有一个完全干净的检查。

* checking Rd line widths ... NOTE
Error: 8: no comma in argument list following S4method
Execution halted

如果我通过所有其他参数( i,j,drop )并记录所有参数但我不使用它们,我可以摆脱这种情况。 在我看来,如果在这种情况下不需要添加额外的文档,那将是一种浪费。

#' An S4 class that stores a list.
#' @export
setClass("testClass", 
                 representation(a="list"))

#' Extract parts of testClass.
#' @param x testClass
#'
setMethod("[", signature(x = "testClass"),
            function (x){
                print("void function")
            }
)

导致错误的Rd文件:

% Generated by roxygen2 (4.1.1): do not edit by hand
% Please edit documentation in R/test.R
docType{methods}
name{[,testClass-method}
alias{[,testClass-method}
title{Extract all elements}
usage{
S4method{[}{testClass}(x)
}
arguments{
item{x}{testClass}
}
description{
Extract all elements
}

如果我定义并记录所有参数,则以下Rd不会导致错误

% Generated by roxygen2 (4.1.1): do not edit by hand
% Please edit documentation in R/test.R
docType{methods}
name{[,testClass,missing,missing,missing-method}
alias{[,testClass,missing,missing,missing-method}
title{Extract all elements}
usage{
S4method{[}{testClass,missing,missing,missing}(x, i, j, drop)
}
arguments{
item{x}{testClass}

item{i}{missing}

item{j}{missing}

item{drop}{missing}
}
description{
Extract all elements
}

你可以试试像这样的东西:

setMethod("[", signature(x="testClass", i="missing", j="missing", drop="missing"), ...)

尽管对于我来说这似乎很奇怪,你甚至没有指定i 。 你也可以将i设为"ANY"

另外,您可能必须将您的@param标签更新为以下内容:

#' @param x testClass
#' @param i missing
#' @param j missing
#' @param drop missing

你可能不关心这些参数,但是你使用了一个定义它们的泛型( [ ),所以你非常有义务在你的方法中定义它们,因此也应该在文档中定义它们以突出你的特定方法是不同的通用。 来自?methods

方法定义需要与泛型函数具有相同的形式参数,因为方法调度机制不会因为效率和一致性原因而重新匹配参数。


这里的问题是,你正试图为一个已经有定义的泛型定义一个方法,并且你没有为该泛型方法中的参数提供一个签名。 在这里,通用是[ - 见?[ 。 氧气生成的Rd文件以某种方式生成错误,因为它无法匹配通用签名和它从[.testClass方法自动生成的签名。

解决方案:根据通用的签名定义方法的完整签名。 下面的代码不会在R CMD CHECK --as-cran产生你的错误。

#' An S4 class that stores a list.
#' @docType class
#' @name testClass-class
#' @export
setClass("testClass", 
         slots = c(a="list"))

#' Extract parts of testClass.
#' @param x code{testClass} object
#' @param i index for the testClass list
#' @param j not used
#' @param drop not used
#' @param ... additional arguments not used here
#' @rdname testClass-class
#' @export
setMethod("[", signature(x = "testClass"),
          function (x, i, j, ..., drop=FALSE) {
              print("void function")
          }
)

如果你运行这个,顺便说一下,你可以看到[只是一个方法/函数:

x <- new("testClass")
tmp1 <- x[1]
## [1] "void function"
tmp2 <- `[`(x, 1)
## [1] "void function"
identical(tmp1, tmp2)
## [1] TRUE

还有两件事要注意:

  • 不建议使用S4类定义中的representation() ,而是使用slots() 。 来自?setClass

    表示...所有这些参数都从R 3.0.0版开始弃用,应该避免。

  • 如果你希望别人能够扩展它,你只需要@export类定义。 严格来说,导出该方法并非必要,而是建议。 请参阅https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html。

  • 链接地址: http://www.djcxy.com/p/27283.html

    上一篇: S4 documentation of "[" with 'missing' arguments

    下一篇: Best way to debug git