【问题标题】:R Integer Key, Value mapR整数键,值映射
【发布时间】:2013-06-24 14:57:07
【问题描述】:

如何在 R 中创建一个从键到值的简单整数映射。

我想以这种方式与之交互:

id_map[245]
>> 3
id_map[123]
>> 4

谢谢

【问题讨论】:

    标签: r map hashmap key-value


    【解决方案1】:

    environments 是 R 中最接近哈希表的东西。不幸的是,它们只支持 character 键。

    ht <- new.env()
    assign(as.character(245), 3, ht)
    get(as.character(245), ht)
    

    environments 是经过散列的,并且比使用向量更有效。与其他 R 对象不同,environments 在作为函数的参数提供时通过引用传递。

    您可以轻松地使用它来实现一些感觉自然的东西。

    new.hashtable <- function() {
        e <- new.env()
        list(set = function(key, value) assign(as.character(key), value, e),
             get = function(key) get(as.character(key), e),
             rm = function(key) rm(as.character(key), e))
    }
    ht <- new.hashtable()
    ht$set(245, 3)
    ht$get(245)
    # [1] 3
    

    【讨论】:

    • rm 存在错误。 &gt; ht$rm(245): Error in rm(as.character(key), e) : ... must contain names or character strings Called from: rm(as.character(key), e)
    【解决方案2】:

    您可以使用数字向量,其缺点是需要额外的努力才能使其成为动态。

    > id_map <- numeric(500)
    > id_map[c(245,123)] <- c(3,4)
    > id_map[245]
    [1] 3
    > id_map[123]
    [1] 4
    

    或者你可以使用一个动态数据结构的列表:

     > id_map <- list(500)
    > id_map[c(245,123)] <- c(3,4)
    > id_map[245]
    [[1]]
    [1] 3
    
    > id_map[123]
    [[1]]
    [1] 4
    

    请注意,使用“[”函数返回列表的第二种选择,但您可以使用 "[[" 从该列表中返回单个值:

    > id_map[[245]]
    [1] 3
    > id_map[[123]]
    [1] 4
    

    【讨论】:

    • 列表解决方案创建了 243 个空元素,因此它的作用类似于(动态)向量,而不是哈希图。我找不到任何方法来制作以整数为键的稀疏数据结构;最接近的是将整数字符串化。 l &lt;- list(); list(toString(245)) &lt;- 3。请注意,您也不能将表达式放在列表构造函数中:list(toString(245)=3 给出“意外'='”错误。
    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多