将数据放入r中的new.env有什么好处?

时间:2013-11-04 16:18:30

标签: r env

将数据放入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)

2 个答案:

答案 0 :(得分:2)

如果您的数据很大并且您必须通过传递函数来修改它,那么这样做有一些优势。当您将data.framevector发送给修改它们的函数时,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

差别不大......