我想使用哈希表来实现简单的掩盖脚本。
输入应使用其符号乘以一个因子,即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)作为结果。有什么问题吗?
答案 0 :(得分: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
。之所以失败,是因为子集运算符$
无法使用变量,它的右侧需要一个未评估的名称。因此,代码将始终在x
中查找文字名称h
。该答案显示了如何避免该问题。
答案 1 :(得分:1)
您的函数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]])
}