转换 R 脚本的简单哈希 table

Simple hash table for a conversion R script

我想使用哈希 table 来实现简单的转换脚本。 输入应与使用其符号的因子相乘,即 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)

使用上面的代码,我得到 numeric(0) 作为结果。有什么地方出错了吗?

您的函数 sym2num 总是 returns "x" 的散列,它是 NULL。

h$xh[["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]])
}

这里使用 {hash} 库没有任何好处。实际上,由于您在每次子集化之前重新散列向量,因此与直接查找相比,这 效率显着降低

即使您只构造一次哈希 table 而不是重复构造,不使用它可能 仍然 会更快:哈希 table实现会带来大量恒定的开销。对于相当大的 tables.

,它仅比直接向量或列表子集快

相反,只需这样做:

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。这失败了,因为子集运算符 $ 不适用于变量,它期望在其右侧有一个 未计算的名称 。因此,代码将始终在 h 中查找文字名称 x。 thc 的回答显示了如何避免这个问题。