【问题标题】:Initializing function arguments in the global environment R在全局环境 R 中初始化函数参数
【发布时间】:2013-08-15 15:54:59
【问题描述】:

我正在寻找一个简单的函数来提高我编写和调试 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 作为它的参数并产生相同的在当前环境下运行 Part B 的效果。

【问题讨论】:

  • 你应该使用 source()-ing 代码而不是使用函数来构建参数。
  • @DWin,将 B 部分放入一个单独的文件中,然后使用 source()-ing 这是一个好主意,并且会简化一些事情。但似乎仍然应该有一种方法可以避免写下 B 部分中的行。
  • 我通常使用 RStudio 进行复制和粘贴,然后将所有逗号替换为分号。当然,您可以使用 word 或其他允许您查找和替换的文本处理器。然后,您可以轻松地获取一行。

标签: r function arguments


【解决方案1】:

这仅适用于定义了所有参数的函数。换句话说, 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())
  }
}

【讨论】:

  • 太棒了!在您的第二个函数中,将forms[[i]] &lt;- NA 替换为“下一个”,我会将其标记为已接受的答案。
【解决方案2】:

如果你想重新分配形式参数,有一个formals&lt;- 函数。默认情况下,它执行分配的环境与创建它的环境相同,但可以更改。见?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= 形式的参数一起使用。

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2016-03-27
    • 2021-10-08
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多