2017-08-28 2 views
2

je le contexte suivant:Roxygen2: documentant classe S3 utilisée comme S4 ​​en cas de surcharge fonction de base de R (cor)

Je ne surchargez cor fonction de base pour que j'ai dans mon paquet .R fichier suivant déclaration:

#'export 
setGeneric("cor") 

maintenant, je veux créer une fonction spécifique pour mes objets (classe nommée stranger) - ici pour la simplicité que je viens considère mon objet est un data.table avec une colonne supplémentaire nommée .id.

#' Correlation for stranger objects 
#' describeIn cor Correlation method for stranger objects. 
setMethod("cor",signature(x="stranger"),function(x, method = c("pearson", "kendall", "spearman")){ 
    selectMethod("cor","ANY")(x[,-'.id',with=FALSE],y=NULL, use="everything",method=method) 
}) 

Si j'understant setGeneric, il repose sur les classes S4 - d'où le paramètre signature.

Cependant, je ne pas utiliser les classes S4 mais construire mon objet stranger de façon simple avec ancienne:

buildClass <- function(x,...){ 
    #... prepare out object as data.table with .ìd column 
    class(out) <- c("stranger", class(out)) 
    return(out) 
} 

C'est, je n'ai pas les classes S4 pour mon objet. Dispacthing fonctionne toujours: l'appel cor sur mes objets applique correctement la méthode dédiée.

Ma question est de documenter correctement cela avec ROxygen2. À l'heure actuelle, lors du chargement de mes fonctions, je rencontre le message suivant:

Updating stranger documentation 
Loading stranger 
Creating a generic function for 'cor' from package 'stats' in package 'stranger' 
in method for 'cor' with signature 'x="stranger"': no definition for class "stranger" 

Je l'ai déjà lu attentivement vignette Hadley sur roxygen2 ainsi que quelques questions qui semblent liées à stackoverflow, mais ils ne traitent soit avec le mécanisme S3 classique ou S4 pur alors que je n'ont pas de constructeur S4 avec setClass et setGeneric repose sur S4.

Répondre

1

Plutôt que de définir une méthode générique S4 pour cor(), vous pouvez la redéfinir comme générique S3 et lui définir des méthodes. Pour illustrer, j'ai créé un package R avec seulement deux fichiers R, "buildClass.R" et "cor.R", reproduit ci-dessous:

buildClass.R:

#' Stranger Class Constructor 
#' 
#' Put some details about it 
#' 
#' @param x an object 
#' 
#' @export 
buildClass <- function(x){ 
    class(x) <- c("stranger", class(x)) 
    return(x) 
} 

cor. R

#' Cor 
#' 
#' Put some details about it 
#' 
#' @param x an object 
#' @param ... other arguments 
#' 
#' @rdname cor 
#' @export 
cor <- function(x, ...) { 
    UseMethod('cor', x) 
} 

#' @rdname cor 
#' @export 
cor.stranger <- function(x, ...) { 
    return(1) 
} 

#' @rdname cor 
#' @export 
cor.default <- function(x, ...) { 
    return(stats::cor(x, ...)) 
} 

Ensuite, si vous chargez votre colis (nommé dans mon cas « anRpackage »), l'utilisateur sera averti défini les masques de paquet stats::cor, mais la façon dont cor.default(), stats::cor() est appelé pour des objets qui ne sont pas de classe stranger:

library(anRpackage) 

Attaching package: ‘anRpackage’ 

The following object is masked from ‘package:stats’: 

    cor 

set.seed(1234) 
regular_mat <- matrix(rnorm(100), nrow = 25) 
stranger_mat <- buildClass(regular_mat) 
cor(regular_mat) 

      [,1]  [,2]  [,3]  [,4] 
[1,] 1.00000000 0.1531414 -0.01948986 -0.3737424 
[2,] 0.15314141 1.0000000 0.17531423 -0.1752925 
[3,] -0.01948986 0.1753142 1.00000000 0.4371213 
[4,] -0.37374237 -0.1752925 0.43712127 1.0000000 

cor(stranger_mat) 
[1] 1 

Lors de la vérification du paquet avec devtools::check() en utilisant la valeur par défaut cran = TRUE (qui vérifie « en utilisant les mêmes paramètres que CRAN utilise »), pas d'erreurs, avertissements ou des notes ont été relevés:

> check(current.code) 
Updating anRpackage documentation 
Loading anRpackage 
Setting env vars ---------------------------------------------------------------- 
CFLAGS : -Wall -pedantic 
CXXFLAGS: -Wall -pedantic 
Building anRpackage ------------------------------------------------------------- 
'/usr/lib/R/bin/R' --no-site-file --no-environ --no-save --no-restore --quiet \ 
    CMD build '/home/duckmayr/anRpackage' --no-resave-data --no-manual 

* checking for file ‘/home/duckmayr/anRpackage/DESCRIPTION’ ... OK 
* preparing ‘anRpackage’: 
* checking DESCRIPTION meta-information ... OK 
* checking for LF line-endings in source and make files and shell scripts 
* checking for empty or unneeded directories 
* building ‘anRpackage_1.0.tar.gz’ 

Setting env vars ---------------------------------------------------------------- 
_R_CHECK_CRAN_INCOMING_USE_ASPELL_: TRUE 
_R_CHECK_CRAN_INCOMING_   : FALSE 
_R_CHECK_FORCE_SUGGESTS_   : FALSE 
Checking anRpackage ------------------------------------------------------------- 
'/usr/lib/R/bin/R' --no-site-file --no-environ --no-save --no-restore --quiet \ 
    CMD check '/tmp/RtmpTcdHJ5/anRpackage_1.0.tar.gz' --as-cran --timings \ 
    --no-manual 

* using log directory ‘/tmp/RtmpTcdHJ5/anRpackage.Rcheck’ 
* using R version 3.4.3 (2017-11-30) 
* using platform: x86_64-pc-linux-gnu (64-bit) 
* using session charset: UTF-8 
* using options ‘--no-manual --as-cran’ 
* checking for file ‘anRpackage/DESCRIPTION’ ... OK 
* checking extension type ... Package 
* this is package ‘anRpackage’ version ‘1.0’ 
* checking package namespace information ... OK 
* checking package dependencies ... OK 
* checking if this is a source package ... OK 
* checking if there is a namespace ... OK 
* checking for executable files ... OK 
* checking for hidden files and directories ... OK 
* checking for portable file names ... OK 
* checking for sufficient/correct file permissions ... OK 
* checking whether package ‘anRpackage’ can be installed ... OK 
* checking installed package size ... OK 
* checking package directory ... OK 
* checking DESCRIPTION meta-information ... OK 
* checking top-level files ... OK 
* checking for left-over files ... OK 
* checking index information ... OK 
* checking package subdirectories ... OK 
* checking R files for non-ASCII characters ... OK 
* checking R files for syntax errors ... OK 
* checking whether the package can be loaded ... OK 
* checking whether the package can be loaded with stated dependencies ... OK 
* checking whether the package can be unloaded cleanly ... OK 
* checking whether the namespace can be loaded with stated dependencies ... OK 
* checking whether the namespace can be unloaded cleanly ... OK 
* checking loading without being on the library search path ... OK 
* checking dependencies in R code ... OK 
* checking S3 generic/method consistency ... OK 
* checking replacement functions ... OK 
* checking foreign function calls ... OK 
* checking R code for possible problems ... OK 
* checking Rd files ... OK 
* checking Rd metadata ... OK 
* checking Rd line widths ... OK 
* checking Rd cross-references ... OK 
* checking for missing documentation entries ... OK 
* checking for code/documentation mismatches ... OK 
* checking Rd \usage sections ... OK 
* checking Rd contents ... OK 
* checking for unstated dependencies in examples ... OK 
* checking examples ... NONE 
* DONE 

Status: OK 

R CMD check results 
0 errors | 0 warnings | 0 notes 
+0

Merci. Effectivement. Je trouve aussi la possibilité suivante qui supprime n'importe quelle note: mettre 'setOldClass (c (" étranger "))' avant ma fonction génératrice étrangère. Avoir à attendre un certain temps pour le prix de la prime. –

+0

@EricLecoutre Glad cela a aidé! – duckmayr