2014-01-30 64 views
2

我想知道,如果它被設定爲R可能使該改變的數據集,並不會返回它作爲一個值的函數。原因主要是因爲我擔心在非常大的數據集上遇到問題的時間難度。要獲得具體的 - 我有型一個R函數改變數據集 - 而不是回到它

f <- function(data, ...) { 
    add several columns to data 
    return(data) 
} 

的功能,這意味着我需要調用

data <- f(data, ...) 

更新的數據集。相反,我只想致電

f(data) 

更新(添加列)我的數據集。

我有兩個問題:

1)是我的假設,我現在使用需要很長的時間了非常大的數據的方法設置正確? (或者R會以某種方式看到,我剛剛添加了列?)

2)有沒有辦法修改函數來完成我提出的操作?

在此先感謝!

+0

你有一個真實的例子進行了測試,發現它的時間太長?如果性能和巨大的數據集是你的問題,那麼使用'data.table'對象,而不是一個'data.frame'是必不可少的。不知道,你可以通過R參考通過,但你可以在全球環境LEVE的數據,仍然有一個函數內從訪問它。 –

+1

是不是什麼''data.table':='函數已經在做什麼? – dickoa

回答

0

據我所知,在你的問題中,由dickoa評論,data.table應該已經這樣做了:檢查?data.table,然後搜索鏈接「幫助頁面:=」。這將解釋如何通過引用來分配data.table。

2

關於你的第一個問題:只是測試它。我將在下面舉一個例子,但是用你自己的代碼和你自己的數據集進行測試。

library(MASS) 

data <- as.data.frame(mvrnorm(1E6, mu=rep(0, 20), Sigma=diag(1:20))) 
data2 <- data 

add_columns <- function(data) { 
    data$X <- rnorm(1E6) 
    data$y <- rnorm(1E6) 
    data 
} 

測試與函數調用:

> system.time({ 
+ data <- add_columns(data) 
+ }) 
    user system elapsed 
    0.567 0.000 0.568 
> system.time({ 
+ data <- add_columns(data) 
+ }) 
    user system elapsed 
    0.711 0.128 0.839 

沒有函數調用:

> system.time({ 
+ data2$X <- rnorm(1E6) 
+ data2$y <- rnorm(1E6) 
+ }) 
    user system elapsed 
    0.650 0.020 0.669 
> system.time({ 
+ data2$X <- rnorm(1E6) 
+ data2$y <- rnorm(1E6) 
+ }) 
    user system elapsed 
    0.589 0.024 0.613 

函數調用稍慢(也許),但差別是如此之小,我不會麻煩開始搞亂全球任務或環境。

相關問題