2012-10-05 43 views
2

我有一個R腳本,它接受R的其他腳本並以這種方式操作它們,並執行它們的代碼。我的腳本使用了一些變量(顯然),當其他腳本使用一個公共變量名時,我陷入了一團糟。我希望我可以像膠囊一樣執行另一個腳本,以使相符的變量不會相互影響。R語言中的變量衝突

我一直在閱讀關於環境的知識,並做了大量的嘗試,但我沒有抓住他們的真正含義。

例子:

script1.txt 
___________ 
i=sample(10:20,1) 

script2.txt 
___________ 
i=sample(10:20,1) 

myscript.txt 
___________ 
other.script = c("script1.txt", "script2.txt") 
for(i in 1:2) { 
    source(other.script[i]) 
} 
i==2 

我希望每一個變量「i」不其不影響其他的人的責任(特別是在一個在的MyScript,我不那麼在意其他的)。

+0

你能不能使用像Ĵ另一個變量?如果你描述你的設置和你想要做什麼,這可能會更有幫助? –

+2

@TylerRinker依賴變量的名稱是不同的,如果腳本變得太大,可能會很棘手。抽象爲函數確保變量對函數是局部的,從而防止任何不需要的交互。 –

回答

6

對付它的最好方法是創建一組功能,這削減了你的腳本拍攝的功能。每個函數都在其自己的環境中執行,防止變量以其他方式進入。理想情況下,函數不應該太長,比如10-20行或代碼。一個比調用這些函數來完成任務更大的腳本。如果你正確地做到這一點,你的腳本可以簡短並且重要。我通常將這些函數存儲在一個或多個腳本文件中,準備由需要它們的腳本編輯。你甚至可以將它們包裝在一個包中。

您想要訂購腳本的方式,所有變量都是全局變量,即在整個程序中都可訪問。一般來說,應避免像鼠疫這樣的全局變量。這正是因爲你的問題重點在於:我如何讓變量不會互相干擾。就像我說過的,抽象成函數或對象是防止這種情況發生的方式。對全局變量和更多的信息,在那裏可以找到:

+0

+1 - 可以說不使用全局變量。 – flodel

+0

@ flodel增加了一些信息 –

5

您正在尋找sys.source。您處於正確的軌道上,您需要創建一個environment,然後在該環境中運行該腳本。

other.script = c("script1.txt", "script2.txt") 
for(i in 1:2) { 
    env<-new.env(parent = baseenv()) 
    sys.source(other.script[i],env) 
    print(get('i',env)) # prints the value of i 
} 
i==2 # TRUE 
+1

+1,儘管腳本在其自己的環境中執行並檢索結果供以後在腳本中使用,這聽起來非常接近函數的概念。 –

+0

是的,我同意。但是,我可以考慮一些有用的情況。想象一下,你給一個班級分配了一些家庭作業,並且你告訴他們將他們的答案存儲在最終變量中。您將收集所有提交作爲文件,然後嘗試連續運行每個提交。我知道,這是有衝擊力的,但不是完全不可能的用例。 – nograpes

+1

我完全同意可能有用例,但我通常會盡量避免它。 –