Search code examples
rhashhashtable

Simple hash table for a conversion R script


I would like to use hash table to implement simple coversion script. An input should be multiplied with a factor using its symbol, i.e. y = x * 1E-12, should be called e.g. y <- X2Y(x,"p") with "p" being the symbol for 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)

With the above code I get numeric(0) as result. Any idaes where it goes wrong?


Solution

  • There’s no benefit to using the {hash} library here. Indeed, since you rehash your vector before each subsetting, this will be substantially less efficient than a direct lookup.

    Even if you only constructed the hash table once instead of repeatedly, it would probably still be faster not to use it: the hash table implementation carries a substantial constant overhead. It’s only faster than direct vector or list subsetting for fairly large tables.

    Instead, just do this:

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

    This is idiomatic, efficient R code.


    Fundamentally, the mistake in your R code was the subsetting, h$x. This fails because the subset operator $ doesn’t work with variables, it expects an unevaluated name on its right-hand side. The code will thus always look up the literal name x inside h. thc’s answer shows how to avoid the issue.