On Fri, Dec 31, 2010 at 04:07:07PM -0800, Martin Morgan wrote: [...] > Better to use an environment (and live with reference semantics) > > e <- new.env(parent=emptyenv()); t0 <- Sys.time() > for (i in seq_len(1e6)) { > key <- as.character(i) > e[[key]] <- i > if (0 == i %% 10000) > print(i / as.numeric(Sys.time() - t0)) > }
There is a related thread on R-devel. In particular https://stat.ethz.ch/pipermail/r-devel/2010-December/059526.html also suggests to use an environment, but with hash=TRUE. This option seems to allow faster access. Using the code e <- new.env(parent=emptyenv(), hash=TRUE) for (k in seq_len(10)) { s <- 0 ti <- system.time( for (i in seq_len(5000)) { key <- as.character(10*i + k) e[[key]] <- i s <- s + e[[key]] } ) print(unname(ti["user.self"])) } i get, for example [1] 0.146 [1] 0.149 [1] 0.151 [1] 0.13 [1] 0.15 [1] 0.131 [1] 0.131 [1] 0.115 [1] 0.111 [1] 0.143 and with e <- new.env(parent=emptyenv()) for example [1] 0.247 [1] 0.453 [1] 0.661 [1] 0.868 [1] 1.079 [1] 1.29 [1] 1.507 [1] 1.724 [1] 1.947 [1] 2.172 Petr Savicky. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.