带有 'missing' 个参数的“[”的 S4 文档
S4 documentation of "[" with 'missing' arguments
这个问题与 this question 非常相似,但是当我尝试回答时,我在 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
:
Method definitions are required to have the same formal arguments as the generic function, since the method dispatch mechanism does not rematch arguments, for reasons of both efficiency and consistency.
这里的问题是您正在尝试为已经有定义的泛型定义方法,而您没有为该泛型方法中的参数提供签名。在这里,泛型是 [
-- 请参阅 ?[
。氧气生成的 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")
}
)
如果你 运行 这个,顺便说一句,你可以看到 [
只是一个 method/function:
x <- new("testClass")
tmp1 <- x[1]
## [1] "void function"
tmp2 <- `[`(x, 1)
## [1] "void function"
identical(tmp1, tmp2)
## [1] TRUE
还有两点需要注意:
S4 class 定义中的 representation()
已弃用,请改用 slots()
。来自 ?setClass
:
representation... All these arguments are deprecated from version
3.0.0 of R and should be avoided.
如果您希望其他人能够扩展它,您只需要 @export
class 定义。严格来说,导出方法不是必需的,但建议这样做。见 https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html.
这个问题与 this question 非常相似,但是当我尝试回答时,我在 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
:
Method definitions are required to have the same formal arguments as the generic function, since the method dispatch mechanism does not rematch arguments, for reasons of both efficiency and consistency.
这里的问题是您正在尝试为已经有定义的泛型定义方法,而您没有为该泛型方法中的参数提供签名。在这里,泛型是 [
-- 请参阅 ?[
。氧气生成的 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")
}
)
如果你 运行 这个,顺便说一句,你可以看到 [
只是一个 method/function:
x <- new("testClass")
tmp1 <- x[1]
## [1] "void function"
tmp2 <- `[`(x, 1)
## [1] "void function"
identical(tmp1, tmp2)
## [1] TRUE
还有两点需要注意:
-
S4 class 定义中的
representation()
已弃用,请改用slots()
。来自?setClass
:representation... All these arguments are deprecated from version 3.0.0 of R and should be avoided.
如果您希望其他人能够扩展它,您只需要
@export
class 定义。严格来说,导出方法不是必需的,但建议这样做。见 https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html.