H = hash()
H[["numbers"]] = c(1,2,3)
H[["alpha"]] = c("x","y","z")
H[["animals"]] = c("cat","dog")
现在我想使用“猫”来获取“动物”。根据值获取哈希的键。
我不确定如何遍历hash
,但是如果将哈希转换为列表,这将变得很容易。
search <- 'cat'
H1 <- as.list(H)
Filter(function(x) any(search == x), H1)
#$animals
#[1] "cat" "dog"
获得名称:
names(Filter(function(x) any(search == x), H1))
#[1] "animals"
[其他替代方法:
names(H1)[sapply(H1, function(x) any(search == x))]
names(purrr::keep(H1, ~any(search == .x)))
names(purrr::discard(H1, ~all(search != .x)))
数据
library(hash)
H = hash()
H[["numbers"]] = c(1,2,3)
H[["alpha"]] = c("x","y","z")
H[["animals"]] = c("cat","dog")
除非我没有记错,否则哈希表旨在提供对values keys的快速/高效查找,而不是相反。
一种相反的方法[
v <- NULL
for (k in ls(envir = H)) if ("cat" %in% H[[k]]) v <- k
v
# [1] "animals"
H[[v]]
# [1] "cat" "dog"
而高速缓存未命中将看起来像:
v <- NULL for (k in ls(envir = H)) if ("kangaroo" %in% H[[k]]) v <- k v # NULL
但是,如果您想要,我会认为(1)您将增加复杂性,并且(2)所有写入的速度都会降低。这实际上将具有两个哈希表,一个将键映射到值,另一个将每个值匹配到键。与此相关的一个问题是,在哈希表中,具有多个键引用的值是完全合法的,但是没有完美的反向逻辑:虽然指向所有候选键是可行的,但没有1-to -1关系。有效
hash::invert
。invert(H)[["cat"]]
[1] "animals"
这也适用于具有相同值的多个哈希。
H[["mammals"]] = c("cat","dog","human") invert(H)[["cat"]] [1] "animals" "mammals"
话虽如此,我同意其他答案,认为这是执行任务的低效率方式。