首页 > 解决方案 > 转换 R 脚本的简单哈希表

问题描述

我想使用哈希表来实现简单的覆盖脚本。输入应乘以使用其符号的因子,即 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)作为结果。有没有哪里出错了?

标签: rhashhashtable

解决方案


在这里使用 {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 的回答显示了如何避免这个问题。


推荐阅读