0

在 R 中将数据放入新的 .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)
4

2 回答 2

2

如果您的数据很大并且您必须通过函数传递它来修改它,那么这样做有好处。当您将data.frames 或vectors 发送到修改它们的函数时,R 将在对数据进行更改之前制作数据副本。然后,您将从函数返回修改后的数据并覆盖旧数据以完成修改步骤。

如果您的数据很大,则为每个函数调用复制数据可能会导致不必要的开销。使用environments 提供了一种解决此开销的方法。environments 由函数以不同方式处理。如果您将 an 传递environment给函数并修改其内容,R 将直接对它进行操作environment而不复制它。因此,通过将数据放入 anenvironment并将其传递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
于 2013-11-04T16:24:59.370 回答
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

没有太大区别...

于 2013-11-04T17:15:00.257 回答