【问题标题】:What are the advantages of placing data in a new.env in r?将数据放入 r 中的 new.env 有什么好处?
【发布时间】:2013-11-15 07:54:32
【问题描述】:

在 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)

【问题讨论】:

  • 您能否编辑您的问题以添加一些细节或解释是什么情况导致您提出这个问题?如果您可以用一种鼓励单一明确答案而不是可能性列表的方式来表达您的问题,那将是最好的......

标签: r env


【解决方案1】:

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

如果您的数据很大,为每个函数调用复制数据可能会导致不必要的开销。使用environments 提供了一种解决此开销的方法。 environments 对函数的处理方式不同。如果您将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

【讨论】:

  • 如果我添加tracemem(e$k),然后调用f(e)...好像df被复制了,不是吗?
  • 好答案。请注意,@MathhewPlourde 在“修改它们的函数”的措辞上很小心——由于延迟评估,不修改参数的函数通常不会复制对象。此外,如果您有一个 data.frame 并想要这种行为,那么您最好使用 data.table 包。最后,如果您有一个随机对象并且想要这种行为(通过引用复制),请考虑Reference Classes
  • @Matthew 太好了,感谢您确认。那时储蓄从哪里来?我将在答案中发布比较...
  • @andrei 它不应该复制任何东西,所以我不确定为什么tracemem 会显示相反的东西。很遗憾,我目前无法专心调查此事。
【解决方案2】:

让我们比较两种情况。新环境:

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

差别不大……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多