2015-09-24 33 views
0

使用全局變量,我有一個非常大的數據集,我分析它與R.在功能

的問題是,我想加上我的數據集不同處理某些列,我需要它使用一些一些遞歸函數全局變量。每個函數修改一些全局變量並創建一些變量。所以,我在內存的數據集的複製是一個大問題......

我看了一些資料:如果我沒有誤會,既不使用也不<<-可以assign()幫我...

我想要:

mydata <- list(read.table(), ...) 
myfunction <- function(var1, var2) { 
    #modification of global mydata 
    mydata = ... 
    #definition of another variable with the new mydata 
    var3 <- ... 
    #recursive function 
    mydata = myfunction(var2, var3) 
} 

您對我的問題有一些建議嗎?

回答

1

兩個<<-assign將工作:

myfunction <- function(var1, var2) { 
    # Modification of global mydata 
    mydata <<- ... 
    # Alternatively: 
    #assign('mydata', ..., globalenv()) 

    # Assign locally as well 
    mydata <- mydata 

    # Definition of another variable with the new mydata 
    var3 <- ... 

    # Recursive function 
    mydata = myfunction(var2, var3) 
} 

這就是說,它幾乎總是一個壞主意,想從一個函數修改全局數據,幾乎可以肯定有一個更好的解決方案了這一點。

此外,注意<<-實際上是不一樣的在globalenv()賦值給一個變量,而,把它分配給在父範圍的變量,無論可能。對於全球環境中定義的功能,這是全球環境。對於其他地方定義的功能,全球環境是而不是

+0

我知道,但是當我編碼它時:assign()或<< - 我在全局環境中修改了mydata,但不是在我的函數的本地環境中。所以當我在myfunction()中使用遞歸函數時:修改不適用。 修改如下:dataset [dataset [,「colx」] == var1,] = anotherfunction()所以assign()在這裏對我來說真的很不方便... – EaudeRoche

+0

@EaudeRoche哦,明白了。但實際上,解決這個問題很簡單:做兩個分配,一個本地和一個非本地。看我的編輯。您還可以更改這些操作的順序:先在本地分配* first *,然後在全局分配。 –

+0

@ konrad-rudolf好的!所以我將不得不復制每個迭代的數據集。 – EaudeRoche