1

假设我有这两个功能:

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-class 函数,因此嵌套它们将需要fInner在每个小的迭代器定义中复制内部。

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

4

1 回答 1

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了解更多信息。

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

于 2013-08-10T18:11:55.173 回答