这是我写的一个函数:
lookup <- function (keys, values, key, default) {
found <- which(keys == key)
if (length(found) == 1) return(values[found])
if (length(found) == 0) return(default)
stop("lookup(",keys,",",values,",",key,",",default,"): duplicate keys")
}
它完成我需要的东西:
> lookup(c("a"),c(3),"a",0)
[1] 3
> lookup(c("a"),c(3),"b",0)
[1] 0
> lookup(c("a","a"),c(3),"a",0)
Error in lookup(c("a", "a"), c(3), "a", 0) : lookup(aa,3,a,0): duplicate keys
问题是:它看起来风格对吗? 我错过了什么吗?
(具体来说,我希望这个函数可以写成单个表达式)。
我确实理解这涉及完整的向量查找,因此效率低下,如果我想要快速,我应该使用data.table
。幸运的是,这种情况下的表现并不重要,因为我的数据非常小。
谢谢!
答案 0 :(得分:5)
R通过names
dict <- c("Key1"="val1", "Key2"="val2")
dict[["Key1"]]
# [1] "val1"
dict[["Key3"]]
# Error in dict[["Key3"]] : subscript out of bounds
getVal <- function(key, dict=defaultDict) {
if (! key %in% names(dict) )
return(defaultValue)
dict[[key]]
}
答案 1 :(得分:2)
我不确定为什么你期望这个更短 - 逻辑实际上是在一个表达式中,只是错误处理不可避免地变得混乱 - 顺便说一下它是误导/错误。我还要default
可选。然后我们得到:
lookup <- function (keys, values, key, default = NULL) {
if (length(keys) != length(values))
stop('lookup(', keys, ', ', values, ', ', key, ', ', default,
'): lengths of keys and values mismatch')
indices <- which(keys == key)
if (length(indices) > 1)
stop('lookup(', keys, ', ', values, ', ', key, ', ', default,
'): ambiguous match')
if (length(indices) == 0) default else values[indices]
}