2015-07-07 17 views
7

Questa domanda è molto simile a this question ma quando provo la risposta ricevo un'aggiunta "NOTA" dopo R CMD check. Anche se è solo un NOTE mi piacerebbe davvero avere un controllo completamente pulito.Documentazione S4 di "[" con argomenti "mancanti"

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

posso sbarazzarsi di questo se mi passa tutti gli altri parametri (i,j,drop) e documento tutti loro, ma io non li uso. Mi sembra che sarebbe inutile aggiungere una documentazione aggiuntiva quando non è rilevante in questo caso.

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

Il file Rd causando l'errore:

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

i seguenti risultati Rd in nessun errore se definire e documentare tutti gli argomenti

% 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

Non è uno spreco documentarli. Si sta utilizzando un generico che ha una firma definita, e chiunque usi quel generico avrebbe la ragionevole aspettativa che dovrebbe comportarsi come generico (cioè fornire 'i',' j', ecc.) Se non diversamente documentato esplicitamente. La parte più sorprendente per me era che il controllo R CMD si stava solo lamentando dei documenti non validi, in contrasto con la definizione del metodo improprio. – BrodieG

+0

@BrodieG, questo sarò d'accordo. Il metodo potrebbe essere definito ma solo la documentazione si lamentava. Forse è necessario un miglioramento del controllo R CMD? – cdeterman

risposta

3

Si può provare provare qualcosa di simile :

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

anche se mi sembra abbastanza strano che tu non stia nemmeno specificando i. È anche possibile impostare i su "ANY".

Inoltre, si dovrà probabilmente per aggiornare i @param tag a qualcosa di simile:

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

Tu non puoi cura di questi parametri, ma si sta utilizzando un generico che loro ([) definisce in modo che siano abbastanza molto obbligati a definirli nel tuo metodo e come tali dovrebbero anche definirli nei documenti per evidenziare che il tuo particolare metodo è diverso dal generico. Da ?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

Grazie per la risposta, ma questo risulta ancora in NOTA ed errore menzionato sopra. Non sto impostando 'i' perché l'intento è fornire la sintassi per restituire tutti gli elementi nell'oggetto di classe S4. – cdeterman

+0

@cdeterman sarebbe utile se fosse possibile fornire versioni 'roxygen', versioni R, nonché una versione minima del contenuto del file Rd che causa i problemi. – BrodieG

+0

@cdeterman, vedere gli aggiornamenti per rispondere allo – BrodieG

0

Il problema qui è che si sta cercando di definire un metodo per un generico che ha già una definizione, e non sta fornendo una firma per gli argomenti di quel metodo generico. Qui, il generico è [ - vedi ?[. Il file Rd generato dall'ossigeno genera in qualche modo l'errore perché non può corrispondere alla firma per il generico con la firma che genera automaticamente dal tuo metodo [.testClass.

La soluzione: Definire la firma completa per il metodo, in base alla firma del generico. Il codice qui sotto non genererà il tuo errore nel 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") 
      } 
) 

Se si esegue questo, tra l'altro, si può vedere come [ è solo un metodo/funzione:

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

più Due cose da notare:

  1. representation() in una definizione di classe S4 obsoleta, utilizzare invece slots().Da ?setClass:

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

  2. Hai solo bisogno di @export la definizione della classe, se si desidera che gli altri siano in grado di estenderlo. Esportare il metodo è strettamente parlando, non necessario, ma consigliato. Vedi https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html.

Problemi correlati