2017-08-28 6 views
2

Ich habe den folgenden Zusammenhang:Roxygen2: Dokumentieren von S3-Klasse als S4 verwendet, wenn R Basisfunktion Überlastung (cor)

ich Überlastung cor Funktion Basis, so dass ich in meinem Paket habe .r Datei folgende Anweisung:

#'export 
setGeneric("cor") 

Jetzt möchte ich eine bestimmte Funktion für meine Objekte (Klasse stranger genannt) schaffen - hier der Einfachheit halber halte ich nur mein Objekt ein data.table mit einer zusätzlichen Spalte .id benannt ist.

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

Wenn ich setGeneric understant, stützt sie sich auf S4 Klassen - daher der signature Parameter.

Aber ich verwende S4 Klassen nicht aber mein stranger Objekt mit einfacher alter Art und Weise bauen:

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

Das heißt, ich habe nicht S4-Klassen für mein Objekt. Dispaxing funktioniert immer noch: Aufruf cor auf meine Objekte korrekt anwenden die dedizierte Methode.

Meine Frage ist über die richtige Dokumentation mit ROxygen2. Zur Zeit, als meine Funktionen Laden, ich folgende Meldung auftreten:

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" 

Ich habe bereits sorgfältig Hadley Vignette auf roxygen2 lese plus einige Fragen, die auf Stackoverflow im Zusammenhang erscheinen, aber sie nur behandeln entweder mit klassischem S3 Mechanismus oder reiner S4 während ich habe keinen S4-Konstruktor mit setClass und setGeneric setzt auf S4.

Antwort

1

Anstatt eine generische S4-Methode für cor() festzulegen, können Sie sie als generisches S3 definieren und Methoden dafür definieren. Zur Veranschaulichung: Ich habe ein R-Paket mit nur zwei R-Dateien "buildClass.R" und "cor.R", im Folgenden wiedergegeben:

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, ...)) 
} 

Dann, wenn Sie Ihr Paket laden (mit dem Namen in meinem Fall „anRpackage“), wird der Benutzer gewarnt, dass die Paket-Masken stats::cor, aber die Art und Weise cor.default() definiert sind, 012.wird für Objekte genannt, die nicht der Klasse sind 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 

Wenn das Paket mit devtools::check() Überprüfen der Standard mit cran = TRUE (die „mit den gleichen Einstellungen wie CRAN verwendet“ überprüft), keine Fehler, Warnungen oder Hinweise wurden ausgelöst:

> 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

Danke. Tatsächlich. Ich finde auch folgende Möglichkeit, die jede Notiz entfernt: put 'setOldClass (c (" Fremder "))' vor meiner fremden erzeugenden Funktion. Ich muss einige Zeit auf den Kopfgeldpreis warten. –

+0

@EricLecoutre Schön, dass das geholfen hat! – duckmayr

Verwandte Themen