当我在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中尝试了很多参数组合而没有运气。
我该如何解决这个问题?
答案 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年的历史了,重要的更新)。
希望这有帮助