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 に答える