【问题标题】:setMethodS3 fails to correctly reassign default functionsetMethodS3 无法正确重新分配默认函数
【发布时间】:2014-02-20 19:04:42
【问题描述】:

当我在 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 中的参数组合,但没有成功。

我该如何解决这个问题?

【问题讨论】:

    标签: r oop


    【解决方案1】:

    首先,我强烈建议以常规方式调用 S3 方法,而不是通过 &lt;object&gt;$method(...) 方式,例如match(hope) 而不是 hope$match()如果您这样做,一切都会按预期进行。

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

    不兼容

    最后,您真的应该真正更新您的 R - 它确实很古老,除非您运行最新的稳定 R 版本(现在 R 3.0.2 很快将成为 R 3.1.0,否则很少有人愿意帮助您解决问题) )。至少,您应该确保运行最新版本的软件包(您的 R.methodsS3 和 R.oo 版本到现在已经快 2 年和 1 年了,此后还有重要更新)。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2018-09-05
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多