2

这是我写的一个函数:

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我确实知道这涉及到完整的向量查找,因此效率低下,如果我希望它更快,我应该使用它。幸运的是,这种情况下的性能并不重要,因为我的数据非常非常小。

谢谢!

4

2 回答 2

6

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]]
}
于 2013-04-29T20:53:45.687 回答
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]
}
于 2013-04-29T20:55:23.780 回答