整数键值映射

3

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

我希望以这种方式与它进行交互:

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

谢谢

2个回答

8

环境是R语言中最接近哈希表的东西。不幸的是,它们只支持字符键。

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

环境变量是经过哈希处理的,使用起来比向量更加高效。与其他R对象不同,当作为函数参数提供时,环境变量会通过引用传递。

您可以轻松地使用此功能来实现自然的操作。

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 函数出现错误。 > ht $ rm(245):在 rm(as.character(key), e) 中出现错误: ... 必须包含名称或字符字符串 调用自:rm(as.character(key), e) - Spaceship222

1

你可以使用一个数字向量,但这样做的缺点是需要额外的努力使其动态化。

> 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 <- list(); list(toString(245)) <- 3。请注意,您也不能将表达式放在列表构造函数中:list(toString(245)=3会产生“unexpected '='"错误。 - flies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接