转换 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$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]])
}
这里使用 {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 的回答显示了如何避免这个问题。
我想使用哈希 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$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]])
}
这里使用 {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 的回答显示了如何避免这个问题。