2015-07-07 3 views
7

Diese Frage ist sehr ähnlich zu this question, aber wenn ich die Antwort versuche, erhalte ich einen Zusatz 'NOTE' nach R CMD check. Obwohl es nur ein NOTE ist, würde ich wirklich gerne einen komplett sauberen Check haben.S4 Dokumentation von "[" mit 'fehlenden' Argumenten

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

kann ich loswerden diese, wenn ich alle anderen Parameter übergeben (i,j,drop) und dokumentieren alle von ihnen, aber ich benutze sie nicht. Es scheint mir eine Verschwendung zu sein, zusätzliche Dokumentation hinzuzufügen, wenn es in diesem Fall nicht relevant ist.

#' 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") 
      } 
) 

Die Rd-Datei in dem Fehler führt:

% 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 
} 

Die folgenden Rd ergibt keine Fehler, wenn ich definieren und dokumentieren alle Argumente

% 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 
} 
+0

Es ist keine Verschwendung, sie zu dokumentieren. Sie verwenden ein Generikum, das eine bestimmte Signatur hat, und jeder, der dieses Generikum verwendet, hätte vernünftige Erwartungen, dass es sich wie das generische Verhalten verhalten sollte (d. H. "I", "j" usw.), sofern nicht ausdrücklich anders dokumentiert. Der überraschendste Teil für mich war, dass der R CMD-Check sich nur über die fehlerhaften Dokumente beklagte, im Gegensatz zur falschen Definition der Methode. – BrodieG

+0

@ BrodieG, das werde ich zustimmen. Die Methode könnte definiert werden, aber nur die Dokumentation beschwere sich. Vielleicht ist eine Verbesserung der R-CMD-Prüfung erforderlich? – cdeterman

Antwort

3

Sie versuchen, wie etwas ausprobieren können :

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

obwohl es mir ziemlich komisch vorkommt, dass Sie nicht einmal i angeben. Sie können i auch auf "ANY" setzen.

Auch Sie werden wahrscheinlich Ihre @param Tags zu etwas aktualisieren:

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

Sie können nicht über diese Parameter egal, aber Sie verwenden eine generische, die sie ([), so dass Sie definiert sind ziemlich viel verpflichtet, sie in Ihrer Methode zu definieren und als solche sollten sie auch in den Dokumenten definieren, um Ihre besondere Methode hervorzuheben unterscheidet sich von der generischen. Von ?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.

+0

Vielen Dank für die Antwort, aber dies führt immer noch zu HINWEIS und Fehler oben erwähnt. Ich setze 'i' nicht, weil die Absicht die Syntax liefert, alle Elemente im S4-Klassenobjekt zurückzugeben. – cdeterman

+0

@cdeterman wäre es hilfreich, wenn Sie 'roxygen'-Versionen, R-Versionen sowie eine minimale Version des Inhalts der Rd-Datei bereitstellen könnten, die die Probleme verursacht. – BrodieG

+0

@cdeterman, siehe Updates, um auch zu antworten – BrodieG

0

Das Problem hierbei ist, dass Sie eine Methode für ein Generikum zu definieren versuchen, die bereits eine Definition hat, und Sie sind nicht eine Unterschrift für die Argumente in dieser generischen Methode bereitstellt. Hier ist das generische [ - siehe ?[. Die mit Sauerstoff generierte Rd-Datei generiert den Fehler irgendwie, weil sie die Signatur für das generische Element nicht mit der Signatur vergleichen kann, die sie automatisch von Ihrer [.testClass-Methode generiert.

Die Lösung: Definieren Sie die vollständige Signatur für die Methode, entsprechend der Unterschrift des Generik. Der folgende Code generiert Ihren Fehler nicht in 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") 
      } 
) 

Wenn Sie dies ausführen, nebenbei bemerkt, können Sie sehen, wie [ nur eine Methode/Funktion:

  1. :

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

    Zwei weitere Dinge zu beachten in einer S4-Klassendefinition ist veraltet, verwenden Sie stattdessen slots().Von ?setClass:

    representation... All these arguments are deprecated from version 3.0.0 of R and should be avoided.

  2. Sie müssen nur die Klassendefinition @export, wenn Sie es andere in der Lage sein erweitern möchten. Exportieren der Methode ist streng genommen nicht notwendig, aber empfohlen. Siehe https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html.

Verwandte Themen