【问题标题】:S4 documentation of "[" with 'missing' arguments带有“缺少”参数的“[”的 S4 文档
【发布时间】:2015-07-07 14:26:51
【问题描述】:

这个问题与this question 非常相似,但是当我尝试回答时,我在R CMD check 之后收到了一个附加的“注意”。虽然它只是一个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
}

【问题讨论】:

  • 记录它们并不是浪费。您正在使用具有明确签名的泛型,并且使用该泛型的任何人都会有合理的期望,除非另有明确说明,否则它应该表现为泛型(即提供ij 等)。更令我惊讶的是,R CMD check 只是抱怨格式错误的文档,而不是不正确的方法定义。
  • @BrodieG,我会同意的。可以定义该方法,但只有文档在抱怨。也许需要改进 R CMD 检查?

标签: r s4 roxygen2


【解决方案1】:

您可以尝试以下方法:

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

方法定义必须具有与泛型函数相同的形式参数,因为出于效率和一致性的原因,方法分派机制不会重新匹配参数。

【讨论】:

  • 感谢您的回答,但这仍然会导致上面提到的注意和错误。我没有设置i,因为目的是提供返回 S4 类对象中所有元素的语法。
  • @cdeterman 如果您能提供roxygen 版本、R 版本以及导致问题的 Rd 文件内容的最小版本,将会很有帮助。
  • 我明白了,我想确保无论如何我都需要定义和记录所有参数。尽管可以定义该方法并且在没有其他参数的情况下可以正常工作,但对我来说似乎有点奇怪,但只有 Rd 会有问题(参见上面的 Rd)。
  • @cdeterman 我怀疑这与泛型在这种情况下是原语有关,尽管我现在无法验证这一点。
【解决方案2】:

这里的问题是您正在尝试为已经有定义的泛型定义一个方法,并且您没有为该泛型方法中的参数提供签名。在这里,泛型是[——见?[。氧气生成的 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

还有两点需要注意:

  1. S4 类定义中的representation() 已弃用,请改用slots()。来自?setClass

    representation... 所有这些参数都已从版本中弃用 R 的 3.0.0,应该避免使用。

  2. 如果您希望其他人能够扩展它,您只需要@export 类定义。严格来说,导出方法不是必需的,但建议使用。见https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2020-04-09
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多