R中的参数/参数名称 - 局部变量的问题

时间:2013-11-25 19:14:56

标签: r function parameters global local

我在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中编写函数的好方法,或者如果你最好为函数使用不同的参数/参数名而不是全局变量名。 通常,您只想将全局变量转发给函数;这就是为什么我通常给他们相同的名字。另外我想在没有规格的情况下避免以下函数调用总是更安全吗?

感谢。

1 个答案:

答案 0 :(得分:3)

我认为你的问题本身并不与“全局”或“本地”变量有关。我认为你只是对函数调用如何评估它们的参数感到困惑。

您已定义了一个包含5个参数的函数:

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

指定默认值的唯一一个是x,默认值为4。这意味着任何其他参数(如果在函数中使用)必须出现在函数调用中。因此,如果在函数内的任何位置引用prasx('US', 3874.38)ctry,则调用arb将始终生成错误。 e.g。

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)

编程时(与在控制台上交互式工作相反),使用完整的命名参数调用函数几乎总是更好。它更容易阅读,更不容易出错,也更容易调试。