【问题标题】:Simple hash table for a conversion R script转换 R 脚本的简单哈希表
【发布时间】:2019-09-21 08:49:06
【问题描述】:

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

【问题讨论】:

    标签: r hash hashtable


    【解决方案1】:

    您的函数sym2num 始终返回“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]])
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 小表大小可能只是为了举例。哈希比 R 向量更有效并不需要更长的表。
      • 您的 sym2num 版本存在问题,例如sym2num("p") 给出了两个输出,p1e-12,而我只需要数字。如何摆脱p
      • @ohemjeh 不,它只提供一个输出。该输出有一个名称,但这不是问题。如果出于审美原因想去掉名字,可以拨打unname就可以了。
      • 是的,这行得通。顺便说一句,因为我忘了提,你的回答很有见地,感谢你花时间写它!
      猜你喜欢
      • 2011-02-08
      • 2014-05-10
      • 2023-03-26
      • 2021-09-21
      • 2012-06-23
      • 1970-01-01
      • 2013-06-12
      • 2016-07-14
      • 2017-06-23
      相关资源
      最近更新 更多