Простая хеш-таблица для сценария преобразования R - PullRequest
0 голосов
/ 02 мая 2019

Я хотел бы использовать хеш-таблицу для реализации простого сценария покрытия.Вход должен быть умножен на коэффициент с использованием его символа, т. Е. Y = x * 1E-12, должен называться, например, y <- X2Y(x,"p"), где "p" является символом для 1E-12.

library(hash)

sym2num <- function(x) {
  h <- hash( c("f"=1E-15,"p"=1E-12,"n"=1E-9,"mu"=1E-6,"m"=1E-3,"c"=1E-2) )
  return(h$x)
}

X2Y <- function(X,x) {
  xNum <- sym2num(x)
  Y <- X * xNum
  return(Y)
}

# y = x * 1E-12
y <- X2Y(x,"p")
print(y)

СПриведенный выше код я получаю числовой (0) в результате.Любые идеи, где это идет не так?

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Использование библиотеки {hash} здесь бесполезно.Действительно, поскольку вы перефразируете свой вектор перед каждым поднабором, это будет существенно менее эффективным , чем прямой поиск.

Даже если вы создали хэш-таблицу только один раз, а не повторно, это, вероятно, все же будьте быстрее его не использовать: реализация хэш-таблицы несет существенные постоянные издержки.Это только быстрее, чем прямое подмножество векторов или списков для довольно больших таблиц.

Вместо этого просто сделайте это:

sym2num <- function(x) {
  c(f = 1E-15, p = 1E-12, n = 1E-9, mu = 1E-6, m = 1E-3, c = 1E-2)[x]
}

Это идиоматический, эффективный код R.


По сути, ошибка в вашем коде R была поднабором h$x.Это терпит неудачу, потому что оператор подмножества $ не работает с переменными, он ожидает неоцененное имя в правой части.Таким образом, код всегда будет искать буквальное имя x внутри h.Ответ thc показывает, как избежать проблемы.

1 голос
/ 02 мая 2019

Ваша функция sym2num всегда возвращает хэш "x", который равен NULL.

h$x - это сокращение для h[["x"]], но вам нужно h[[x]].

Вместо этого используйте:

sym2num <- function(x) {
  h <- hash( c("f"=1E-15,"p"=1E-12,"n"=1E-9,"mu"=1E-6,"m"=1E-3,"c"=1E-2) )
  return(h[[x]])
}
...