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++
做了更多的副本
- 简单的向量集函数可以通过
union
、setdiff
、unique
等函数来完成。还有一个库 "sets" 可以很好地处理我扔给它的简单对象。
- 命名向量(包括命名列表)在很多方面都类似于地图。键是名称,通过一些技巧,您可以从任何类型的对象中创建一个字符串键。我怀疑虽然这些没有散列,但性能似乎不太好。您还可以通过环境实现地图(参见 Natural way to represent hash tables/dictionaries/maps in R) and data.table (Dictionaries and pairs in R)
通常使用这些简单的措施你会走得更远,但我希望看到更严格和更有效的实施。不过我很乐意犯错:-)
我创建了一个 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++ 做了更多的副本
- 简单的向量集函数可以通过
union
、setdiff
、unique
等函数来完成。还有一个库 "sets" 可以很好地处理我扔给它的简单对象。 - 命名向量(包括命名列表)在很多方面都类似于地图。键是名称,通过一些技巧,您可以从任何类型的对象中创建一个字符串键。我怀疑虽然这些没有散列,但性能似乎不太好。您还可以通过环境实现地图(参见 Natural way to represent hash tables/dictionaries/maps in R) and data.table (Dictionaries and pairs in R)
通常使用这些简单的措施你会走得更远,但我希望看到更严格和更有效的实施。不过我很乐意犯错:-)