2013-11-25 132 views
0

我在R中編寫了很多函數,有時我會遇到全局變量和局部變量的問題。更精確地說,如果我有以下的全局變量和函數:R中的參數/參數名稱 - 局部變量的問題

# Defined before function, globally: 
ret <- 0.12314 
fa <- 789989.938 

prasx <- function(ret, fa, ctry, arb, x = "4"){ 
# do some stuff... 
return (yxc) 
} 

然後,我通過調用該函數:

prasx(ret, fa, 'US', 3874.38) # OR 
prasx('US', 3874.38) 

我有時會收到錯誤。很明顯,我認爲如果全局變量在工作區擦除後未初始化,就會發生這種情況。

我想知道這是否是在R中編寫函數的好方法,或者如果您最好對全局變量名稱使用不同的參數/參數名稱作爲函數。 很多時候你只是想將全局變量轉發給函數;這就是爲什麼我通常給他們平等的名字。另外我想,避免下面的函數調用總是比較安全的,沒有規範?

謝謝。

回答

3

我不認爲你的問題本身與「全局」或「本地」變量有關。我認爲你只是對函數調用如何評估他們的論點感到困惑。

你定義的函數5個參數:

prasx <- function(ret, fa, ctry, arb, x = "4"){ 
# do some stuff... 
return (yxc) 
} 

唯一一個指定的默認值是x,用4的默認值。這意味着任何其他參數(如果在函數中使用)都必須出現在函數調用中。因此,如果在函數中的任何點引用了ctryarb,則調用prasx('US', 3874.38)將始終生成錯誤。例如

x <- 4 
f <- function(x,y){x} 
> f(y = 3) 
Error in f(y = 3) : argument "x" is missing, with no default 

最後一點可能讓你感到困惑,因爲你可能以爲你是路過'US'的說法ctry,而你不是。 R分三步評估函數參數。首先,通過參數名稱的精確匹配,然後在參數名稱上進行部分匹配,最後通過位置進行匹配。由於您沒有在prasx('US', 3874.38)中指定任一參數,因此R將其解釋爲等同於prasx(ret = 'US',fa = 3874.38)。 (見here

你的第一個例子中的函數調用是相同的:

prasx(ret = ret,fa = fa,ctry = 'US',arb = 3874.38) 

編程時(而不是在控制檯交互工作),它幾乎總是更好的利用打電話給你的函數的完整的,命名的參數。它比較容易閱讀,不易出錯並且更容易調試。

+0

謝謝!現在我知道了:)因爲我沒有足夠的聲望,所以我不能投票給你:/ – user3032689