2

我正在寻找一个简单的函数来加快我编写和调试 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 部分。

4

2 回答 2

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())
  }
}

您还可以调整函数并通过next在 if 语句之后使用而不是将缺失变量定义为 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())
  }
}
于 2013-08-15T16:32:17.773 回答
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)

如果您希望缺少默认值,则需要alist与表单的参数一起使用。a=

}

于 2013-08-15T16:39:37.093 回答