有“缺少”参数的“[”的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。