ハッシュとしても使用できますenvironment
...見てみましょう:
mappedV <- matrix(1:100000, ncol=5)
hash1 <- list()
hash2 <- new.env(hash=TRUE)
system.time(for(i in 1:nrow(mappedV)) hash1[[paste(mappedV[i,], collapse = '.')]] <- 0)
# user system elapsed
# 19.263 1.321 21.634
system.time(for(i in 1:nrow(mappedV)) hash2[[paste(mappedV[i,], collapse = '.')]] <- 0)
# user system elapsed
# 0.426 0.002 0.430
「注意事項」に回答するように更新
Josh O'Brienが指摘したように、変更時に環境全体がコピーされないため、これは非常に高速です。便利そうですね。
「問題」は、これらのオブジェクトが、その不変性に関して、慣れ親しんだ他のほとんどのオブジェクトと同じように動作することを期待している場合に発生する可能性があります。がenvironment
どこかで変更されると、どこでも変更されます。たとえば、environment
すべての要素を削除する関数にを渡すenvironment
と、リストはどこにでも行き渡りますが、リストはそうではありません。
目撃者:
hash1 <- list(a=1:10, b=rnorm(10))
hash2 <- new.env(hash=TRUE)
hash2$a <- 1:10
hash2$b <- rnorm(10)
danger <- function(x, axe) {
for (wut in axe) x[[wut]] <- NULL
}
## the list is safe
danger(hash1, names(hash1))
hash1
# $a
# [1] 1 2 3 4 5 6 7 8 9 10
#
# $b
# [1] -0.8575287 0.5248522 0.6957204 -0.7116208
# [2] 0.5536749 0.9860218 -1.2598799 -1.1054205
# [3] 0.3472648
## The environment gets mutilated
danger(hash2, names(hash1))
as.list(hash2)
# $a
# NULL
#
# $b
# NULL