我在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中编写函数的好方法,或者如果你最好为函数使用不同的参数/参数名而不是全局变量名。 通常,您只想将全局变量转发给函数;这就是为什么我通常给他们相同的名字。另外我想在没有规格的情况下避免以下函数调用总是更安全吗?
感谢。
答案 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)
编程时(与在控制台上交互式工作相反),使用完整的命名参数调用函数几乎总是更好。它更容易阅读,更不容易出错,也更容易调试。