将数据放入R?-speed等新的.env中有什么好处。
对于时间序列等数据,是一个类似于数据库的新.env吗?
我的问题最初是从R中下载资产价格开始,建议将它们放入新的.env中。为什么会这样?谢谢你:
library(TTR)
url = paste('http://www.nasdaq.com/markets/indices/nasdaq-100.aspx',sep="")
txt = join(readLines(url))
# extract tables from this pages
temp = extract.table.from.webpage(txt, 'Symbol', hasHeader = T)
temp[,2]
# Symbols
symbols = c(temp[,2])[2:101]
currency("USD")
stock(symbols, currency = "USD", multiplier = 1)
# create new environment to store symbols
symEnv <- new.env()
# getSymbols and assign the symbols to the symEnv environment
getSymbols(symbols, from = '2002-09-01', to = '2013-10-17', env = symEnv)
答案 0 :(得分:2)
如果您的数据很大并且您必须通过传递函数来修改它,那么这样做有一些优势。当您将data.frame
或vector
发送给修改它们的函数时,R将在对数据进行更改之前复制数据。然后,您将从函数返回修改后的数据并覆盖旧数据以完成修改步骤。
如果您的数据很大,则复制每个函数调用的数据可能会导致不必要的开销。使用environment
提供了解决此开销的方法。 environment
由函数处理不同。如果您将environment
传递给函数并修改内容,则R将直接在environment
上运行,而无需复制它。因此,通过将数据放在environment
中并将environment
传递给函数而不是直接传递数据,可以避免复制大型数据集。
# here I create a data.frame inside an environment and pass the environment
# to a function that modifies the data.
e <- new.env()
e$k <- data.frame(a=1:3)
f <- function(e) {e$k[1,1] <- 10}
f(e)
# you can see that the original data was changed.
e$k
a
1 10
2 2
3 3
# alternatively, if I pass just the data.frame, the manipulations do not affect the
# original data.
k <- data.frame(a=1:3)
f2 <- function(k) {k[1,1] <- 10}
f2(k)
k
a
1 1
2 2
3 3
答案 1 :(得分:1)
让我们比较两个案例。有了新环境:
e <- new.env()
e$k <- data.frame(a=1:1000000)
f <- function(e) {e$k[1,1] <- 10}
system.time({
for(i in 1:1000) f(e)
})
head(e$k)
user system elapsed
5.32 6.35 11.67
没有新环境:
k <- data.frame(a=1:1000000)
f <- function(e) {e[1,1] <- 10;return(e);}
system.time({
for(i in 1:1000) k <- f(k)
})
user system elapsed
5.07 6.82 11.89
差别不大......