【问题标题】:How to reuse code in an R function?如何在 R 函数中重用代码?
【发布时间】:2015-05-30 15:18:05
【问题描述】:

我有一段代码我想在一个函数中多次使用(我们称之为myFunction)。我自然想避免重复这段代码,但除了将其放入外部文件并每次都获取它之外,我找不到重用它的方法。

我尝试的第一件事是将重复的代码放在不带参数的内部迷你函数中(我们称之为internalFunction。这意味着我可以根据需要调用internalFunction;但是,这掩盖了对象输出来自myFunction主环境的internalFunction

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

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

【问题讨论】:

  • 我不清楚为什么不能将 internalFunction 创建的对象作为返回值返回给 myFunction。也许如果您在一个小示例中发布您尝试过的代码,我可以明白您的意思。

标签: r function code-duplication


【解决方案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))

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

【讨论】:

  • 这可行,但我不想将它们作为列表返回——多个单独的对象会更好。
  • AFAIK,R 只能返回一个对象,所以你必须以某种方式打包它们。我认为这是 R 的基础。如果您更喜欢 OO 编程,也可以将它们打包为 S4 对象,但大多数人只会使用列表。
  • 这对你有用吗?
  • 这很有用,但有点令人失望。是否可以分配 internalFunction 对象,使它们在 myFunction 中可见,但在全局 R 环境中不可见?
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这是一个非常有用的资源。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2012-06-02
  • 2020-06-14
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多