r - 转换 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)作为结果。有没有哪里出错了?
解决方案
在这里使用 {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 的回答显示了如何避免这个问题。
推荐阅读
- docker - 使用 docker 在虚拟机上监听 SQL 代理周围的活动
- linux - 无法通过 netdata 启动 fping_gateway.plugin
- python - 如何在 django 视图中填写 ModelForm
- android - Firebase 电子邮件格式错误
- r - 如何通过特定 ID 撤消 R 中的累积值?
- node.js - 无法在 AWS Beanstalk 上运行 Nodejs 应用程序
- c - 指针可以随意操纵内存吗?
- python - 片段管理和导航交付应用程序
- django - 从 python-social-auth 后端获取 DRF 令牌
- c# - 将字符串转换为数组并在c#中交换两个元素的值?