R Ha sh - получить ключ на основе значения - PullRequest
0 голосов
/ 26 марта 2020
H = hash()
H[["numbers"]] = c(1,2,3)
H[["alpha"]] = c("x","y","z")
H[["animals"]] = c("cat","dog")

Теперь я хочу получить "животных", используя "кошку". получить ключ га sh на основе значения.

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Если я не ошибаюсь, таблица ha sh предназначена для быстрого и эффективного поиска ключей до значений , а не наоборот.

неэффективный способ сделать обратное - перебрать все ключи, чтобы найти значение и go оттуда:

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) все записи станут менее быстрыми. Это будет эффективно иметь две таблицы ha sh, одну для сопоставления ключей со значениями и одну для сопоставления каждого значения с ключом. Одна из проблем заключается в том, что в таблице ha sh совершенно законно иметь значение, на которое ссылаются несколько ключей, но не существует идеального обратного логика c: хотя можно указать все ключи-кандидаты, не является отношением 1 к 1.

0 голосов
/ 26 марта 2020

Я думаю, что вы ищете hash::invert.

invert(H)[["cat"]]
[1] "animals"

Это также работает для нескольких хэшей с одинаковым значением.

H[["mammals"]] = c("cat","dog","human")
invert(H)[["cat"]]
[1] "animals" "mammals"

При этом я согласен с другие ответы, что это неэффективный способ выполнить задачу.

0 голосов
/ 26 марта 2020

Я не уверен, как перебрать hash, но если вы конвертируете ha sh в список, это станет легко.

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")
...