2013-11-04 18 views
0

將數據放入新的.env文件中的優點是什麼?對於R?速度等。將數據放入r中的new.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

http://stackoverflow.com/q/3470447/1412059 – Roland

+2

你能編輯你的問題添加一些細節或解釋什麼情況導致你問這個?如果你能以鼓勵一個確定的答案而不是一系列可能性的方式來描述你的問題是最好的... – joran

回答

2

如果你的數據很大,並且你必須通過傳遞函數來修改它,這樣做有好處。當您將data.frame s或vector s發送到修改它們的函數時,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

如果我添加tracemem(e $ k),然後調用f(e)...似乎df被複制,不是嗎? – ndr

+0

很好的答案。請注意,@MathhewPlourde在「修改它們的函數」的措詞時要小心 - 不會修改參數的函數通常不會由於延遲評估而結束複製對象。另外,如果你有'data.frame'並且想要這種行爲,那麼最好使用'data.table'包。最後,如果你有一個隨機對象,並希望這種行爲(通過引用複製),請考慮[參考類](http://stackoverflow.com/questions/5137199/what-is-the-significance-of-the-new-參考類)。 –

+0

@andrei是的它確實... –

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 

沒有太大的差別...