2013-11-25 70 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