我正在寻找一个简单的函数来加快我编写和调试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部分的效果相同。
答案 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)
如果您希望缺少默认值,则需要将alist
与a=
形式的参数一起使用。
}