如何在R函数中重用代码?

时间:2015-05-30 15:18:06

标签: r function code-duplication

我有一段代码要在函数内多次使用(我们称之为myFunction)。我自然希望避免重复这段代码,但我无法找到一种方法来重复使用它,而不是将其放在外部文件中并每次都采用它。

我尝试的第一件事就是将重复的代码放在没有参数的内部迷你函数中(让我们称之为internalFunction。这意味着我可以根据需要调用internalFunction;但是,这个屏蔽internalFunction的主要环境中myFunction输出的对象。

然后我尝试使用<<-运算符在internalFunction中分配输出对象,以便它们可用于myFunction的主环境。不幸的是,这也使得myFunction之外的全局R环境可以使用这些对象,我想避免这种情况。

有没有办法将R代码块写入对象然后调用它,或从对象而不是文件中获取?我真的想a)避免重复代码和b)在单个文件中包含所有代码。

2 个答案:

答案 0 :(得分:1)

我认为你想要的是一些简单的方法来将多个值返回给调用函数,这可以通过列表来完成,如下所示:

maxmin <- function(i1,i2){

  if (i1>i2){
    mx <- i1
    mn <- i2
  }  else
  {
    mn <- i1
    mx <- i2
  }
  rv <- list(min=mn,max=mx)
  return(rv)
}

r1 <- maxmin(3,4)
r2 <- maxmin(6,5)

print(sprintf("minimums %d %d",r1$min,r2$min))
print(sprintf("maximums %d %d",r1$max,r2$max))

编辑:我删除了列表元素名称的引号,它们不是必需的

答案 1 :(得分:1)

这是另一种方式,但它感觉很棘手,在大多数情况下可能不是一个好的软件工程解决方案。基本上,您可以在父环境中明确访问变量。

fun1 <- function(x)
{
    maxminenv <- function(i1,i2){
      if (i1>i2){
        mx <- i1
        mn <- i2
      }  else
      {
        mn <- i1
        mx <- i2
      }
      penv <- parent.frame()
      penv$min <- mn
      penv$max <- mx
    }
    maxminenv(3,4)
    print(sprintf("min:%d max:%d",min,max))
}
fun1()

有关环境的更多信息,请参阅Hadley Wickam的新书中的这一优秀章节。 http://adv-r.had.co.nz/Environments.html