1

次の 2 つの関数があるとします。

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。それを修正する1つの方法は、例を次のように書き直すことです。

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

しかし、関数をそのようにネストしたくない場合はどうすればよいでしょうか? 私の場合fInner、非常に重くて複雑な関数 (ライブラリに移動したいかもしれません) であり、fOuter実際には 1 つの反復子を定義するアドホックに作成された関数です。私のコードには多くのfOuterクラス関数が含まれているため、それらをネストするには、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 に答える