如何避免嵌套函数定义仍然使用<< - operator

时间:2013-08-10 17:50:33

标签: r nested environment

假设我有这两个功能:

fInner<-function()
{
   # Do some complicated stuff, and...
    I<<-I+1
}

fOuter<-function()
{
    I<-0
    fInner()
    print(I)
}

调用fOuter()会产生错误:Error in fInner() : object 'I' not found。我知道,修复它的一种方法是将示例重写为

fOuter<-function()
{
    fInner<-function()
    {
        I<<-I+1
    }
    I<-0
    fInner()
    print(I)
}

但是,如果我不想以这种方式嵌套功能呢?在我的情况下fInner是一个非常繁重和复杂的函数(我可能想要进入我的库),而fOuter实际上是一个特定的创建函数,它定义了一个迭代器。我的代码中将有许多fOuter - 类函数,因此嵌套它们需要在每一个小的迭代器定义中复制fInner

我怀疑解决方案与环境有关,但我不知道该怎么做。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

您需要访问与fOuter功能相关联的环境 - 调用fInner的位置。您可以使用parent.frame获取此内容,并且可以使用getassign来获取和设置变量:

fInner<-function()
{
  assign("I", get("I", envir=parent.frame()) + 1, envir=parent.frame())
}

fOuter<-function()
{
  I<-0
  fInner()
  print(I)
}

有关详细信息,请参阅?environment?parent.frame

但这只是为了满足您的好奇心!你似乎同意这不是一个好主意。操纵环境和名称很快就会变得复杂,除非你做的事情非常复杂,否则可能有更好的方法。