在全局环境R中初始化函数参数

时间:2013-08-15 15:55:00

标签: r function arguments

我正在寻找一个简单的函数来加快我编写和调试R函数的能力。请考虑以下代码块:

# Part A:
myfun = function(a, b = 5, out = "hello"){
    if(a>b) print(out)
    return(a-b)
    }

# Part B:
b = 5
out = "hello"

# Part C:
do.args = function(f){
    #intialize the arguments of myfun in the parent environment
    ???
    }

函数myfun是一个更大问题的一个简单例子:我经常有一个带有许多参数的复杂函数。为了有效地编写和调试这样的函数,我发现初始化函数的参数很有用,并逐行“逐步”执行该函数。如上面的B部分那样初始化参数有点麻烦,当有很多参数时,我宁愿使用C部分中的函数,它只接受字符串myfun作为参数并生成与在当前环境中运行B部分的效果相同。

2 个答案:

答案 0 :(得分:2)

这仅适用于定义了所有参数的函数。换句话说,myfun必须具有函数中定义的值。

some.func <- function(infunc){
  forms <- formals(infunc)
  for(i in 1:length(forms)){
    assign(names(forms)[i],forms[[i]],envir=globalenv())
  } 
}

您可以添加限定符来处理没有默认值的变量,但它可能不适用于所有示例。在这个例子中,我将所有缺失的变量定义为NA - 您可以更改定义。注意:将缺少的变量分配给NULL将不起作用。

some.func <- function(infunc){
  forms <- formals(infunc)
  for(i in 1:length(forms)){
    if(class(forms[[i]])=="name") forms[[i]] <- NA
    assign(names(forms)[i],forms[[i]],envir=globalenv())
  }
}

您还可以调整函数,只需在if语句后使用next跳过分配缺失的变量,而不是将缺失的变量定义为NA或其他值。 next示例:

some.func <- function(infunc){
  forms <- formals(infunc)
  for(i in 1:length(forms)){
    if(class(forms[[i]])=="name") next
    assign(names(forms)[i],forms[[i]],envir=globalenv())
  }
}

答案 1 :(得分:0)

如果要重新分配正式参数,则有formals<-函数。默认情况下,它进行分配的环境与创建它的环境相同,可以更改。请参阅?formals?alist

 formals(myfun) <- alist(a=,b=4, out="not awake")
 myfun
#------------------
function (a, b = 4, out = "not awake") 
{
    if (a > b) 
        print(out)
    return(a - b)

如果您希望缺少默认值,则需要将alista=形式的参数一起使用。

}