R 是否支持 S4 中的集合?

Does R support collections in S4?

我创建了一个 S4 class ("card"),类似于具有多个字段的记录。现在我想定义一个集合 class ("cat") 来保存许多 "card" 对象。 cat class 将包含搜索、编辑和添加卡片的方法。

这是我要创建的内容的简化版本:

Card <- setClass("Card", 
               representation(dsOwner = "character", dsFile = "character", dsUrl = "character"))

Cat <- setClass("Cat", representation(cardlist = "list"))

setGeneric("addcard", 
       function(catObj, owner, file, url) 
           standardGeneric("addcard"))

setMethod("addcard", 
      signature(catObj = "Cat"), 
      function(catObj, owner, file, url){
          index <- length(catObj) + 1
          catObj[[index]] <- new("Card",
                                 dsOwner = owner,
                                 dsFile = file,
                                 dsUrl = url)
          return(index)
      })

catalog <- new("Cat")

addcard(catalog, owner = "some online resource", file = "some file name", url = "http://some.url")

不幸的是,执行 addcard 方法会抛出一个我不明白的错误:

Error in '[[<-'('*tmp*`, index, value = <S4 object of class "Card">) : 
[[<- defined for objects of type "S4" only for subclasses of environment'.

我没有正确定义猫 class 吗?

R 没有一致的 java/C++ 类容器支持来处理数组、列表、集合、映射等(在 OOP 意义上)。

  • R vectors/lists 在很多方面类似于 java lists/c++ 数组。我不太了解速度和效率,我怀疑 R 不像 java/c++
  • 做了更多的副本
  • 简单的向量集函数可以通过unionsetdiffunique等函数来完成。还有一个库 "sets" 可以很好地处理我扔给它的简单对象。
  • 命名向量(包括命名列表)在很多方面都类似于地图。键是名称,通过一些技巧,您可以从任何类型的对象中创建一个字符串键。我怀疑虽然这些没有散列,但性能似乎不太好。您还可以通过环境实现地图(参见 Natural way to represent hash tables/dictionaries/maps in R) and data.table (Dictionaries and pairs in R

通常使用这些简单的措施你会走得更远,但我希望看到更严格和更有效的实施。不过我很乐意犯错:-)