2017-08-28 100 views
2

记录时使用S3类作为S4我有以下上下文:Roxygen2:重载R基本功能(COR)

我做过载cor基函数,使得我在我的包.R文件以下声明:

#'export 
setGeneric("cor") 

现在我要创建我的对象(类名为stranger)特定的功能 - 在这里为简单起见,我只考虑我的对象是与名为.id附加列data.table。

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

如果我understant setGeneric,它依赖于S4类 - 因此signature参数。

不过,我不使用S4类,但建立自己的stranger对象,具有简单的老办法:

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

也就是说,我没有S4类我的对象。 Dispacthing仍然有效:在我的对象调用cor正确应用专用方法。

我的问题是关于适当记录与ROxygen2。目前,加载我的功能的时候,我碰到下面的信息:

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" 

我已经仔细阅读roxygen2加上一些似乎对计算器的相关问题哈德利的小插曲,但他们只处理或者与古典S3机制或纯S4,而我没有S4的构造与setClasssetGeneric依靠S4。

回答

1

而不是设置一个S4通用方法cor(),可以重新定义它作为一个通用S3并定义它的方法。为了说明,我创建的R包仅具有两个R上的文件, “buildClass.R” 和 “cor.R”,复制如下:

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

然后,如果你加载你的包(在我的情况“anRpackage”命名),用户将被警告,包装口罩stats::cor,但方式cor.default()定义,stats::cor()被称为对于不是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 

当使用缺省cran = TRUE(它检查“使用相同的设置作为CRAN使用”),没有错误,警告,或票据的devtools::check()检查包提出了:

> 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

感谢。确实。我还发现下面的可能性,删除任何说明:把'setOldClass(c(“陌生人”))'在我的陌生人生成函数之前。必须等待赏金奖励。 –

+0

@EricLecoutre很高兴帮助! – duckmayr