setMethodS3无法正确重新分配默认功能

时间:2014-02-20 19:04:42

标签: r oop

当我在R 2.14.1中创建s3方法,然后调用它们时,如果方法与已加载到工作空间的函数(即基本函数)具有相同的名称,则s3对象无法执行方法。相反,它调用基函数并返回错误。此示例使用“匹配”。我今天之前从未遇到过这个问题。自从我上次运行此代码以来,我安装了R 3.0.2,但保留了我的2.14.1版本。由于某些软件包在CRAN中没有更新,我遇到了3.0.2的麻烦(不同的麻烦),所以我将RStudio恢复到2.14.1,然后出现了这个问题。这是一个例子:

rm(list=ls())
library(R.oo)

this.df<-data.frame(letter=c("A","B","C"),number=1:3)

setConstructorS3("TestClass", function(DF) {
  if (missing(DF)) {
    data= NA
  } else {
    data=DF
  }
  extend(Object(), "TestClass",
         .data=data
  )
})

setMethodS3(name="match", class="TestClass", function(this,letter,number,...){
  ret = rep(TRUE,nrow(this$.data))
  if (!missing(number))
    ret = ret & (this$.data$number %in% number)
  if (!missing(letter)){
    ret = ret & (this$.data$letter %in% letter)
  }
  return(ret)
})

setMethodS3("get_data", "TestClass", function(this,...) {
  return(this$.data[this$match(...),])
})

hope<-TestClass(this.df)
hope$match()
Error in match(this, ...) : argument "table" is missing, with no default
hope$get_data()

这是线索的sessionInfo():

sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
  [1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
  [1] R.oo_1.13.0       R.methodsS3_1.4.2

loaded via a namespace (and not attached):
  [1] tools_2.14.1

我在setMethodsS3中尝试了很多参数组合而没有运气。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

首先,我强烈建议您以常规方式调用S3方法,而不是通过<object>$method(...)方式调用,例如match(hope)代替hope$match()如果你这样做,一切都按预期工作。

其次,我可以用R 3.0.2和R.oo 1.17.0重现这个问题。这里使用特定方法名称match()似乎存在一些问题,因为如果您改为使用match2(),则调用hope$match2()会按预期工作。我在尝试创建名为assign()get()的S3方法时遇到了类似的问题。如果尝试,后者实际上会产生错误,例如“试图使用不安全的通用方法名称(相信我们,这是为了良好的原因):得到”。我会将assign(),最有可能match()添加到禁号名称列表中。详细信息:这些函数在R中非常特殊,因此应避免使用这些名称。这是因为,如果完成,则为它们创建S3泛型函数,并且所有调用将通过泛型函数调度,并且与

不兼容

最后,你应该真的更新你的R - 它确实很古老,除非你运行最新的稳定R版本(现在R 3.0.2很快就是R 3.1.0),很少有人会费心去帮你解决问题)。至少,你应该确保运行最新版本的软件包(你的R.methodsS3和R.oo版本现在已经有近2年和1年的历史了,重要的更新)。

希望这有帮助

相关问题