1

これは非常に長い質問になります。では、ご容赦を

私は次のシナリオを持っています。物事をよりよく説明するために疑似コードを与える方が良いと思います

Pythonファイルはtest.pyと言う

def test(i):
    from rpy2.robjects import r
    r.source('r_file.R')
    r.call_function(with some arguments)

    #Some Operations
    del r

ファイル: r_file.R

rm(list=ls(all=TRUE))

#some global variables
#some reference class

#creating an object of reference class
call_function = function(some arguments)
{
    Do some processing
    call few methods on a reference class

    call some more methods and do some operations

    rm(list=ls(all=TRUE))
    gc()

    return(0)

}

Python での関数 test の呼び出しは、'i' のいくつかの値に対して発生します。つまり、常に 1 より大きい i のいくつかの値に対して関数が呼び出されます。つまり、関数はmainから複数回呼び出されます。したがって、R ファイルを複数回ソースします。Python 関数を呼び出すたびに、新しい R インタープリターが必要でした。したがって、関数が呼び出されるたびに r をインポートし、rpy2 オブジェクトも削除します。

r 関数 "call_function" 内で、いくつかのメソッドを呼び出します。これにより、参照クラス オブジェクトが作成されます。

R コード内では、コードの最初と関数 some_function が終了するときに rm を使用します。

この背景を考えると、私が現在直面している問題は、rm がコード内の参照クラスを削除せず、このような警告が表示され続けることです。

In .removePreviousCoerce(class1, class2, where, prevIs) :
  methods currently exist for coercing from "Rev_R5" to "envRefClass"; they will be replaced

ここで、Rev_R5 は参照クラスです。rm を使用して参照クラスに関連するすべてのメソッドオブジェクトを削除する方法はありますか?

4

1 に答える 1

4

Rのグローバル環境からすべてのオブジェクトを削除しても、新しく開始したRプロセスに戻ることにはなりません(クラスとメソッドの定義は、発見したとおりに残る場合があります)。

removeClass()、、などのR関数を検討することremoveMethod()removeGenericできますが、客観的な要件がない限り(大きなオブジェクトを何度もロードしないようにするなど)、毎回Rプロセスを作成するのが最も安全な方法です(Rを開始する)。プロセスは比較的高速です)。

埋め込まれたR(rpy2ではなくRからの制限)を終了して再開することはできないため、Rを埋め込んだPythonプロセスを開始および停止する必要があります。

そのための1つの方法は、Pythonパッケージmultiprocessing(Pythonの標準ライブラリに含まれています)を使用することです。追加のボーナスは、プロセスを並行して実行できることです。

DougHellmannの優れたチュートリアルをベースとして使用した簡単な例:

import multiprocessing

def R_worker(i):
    """worker function"""

    print('Worker %i started' % i)
    from rpy2.robjects import r
    r.source('r_file.R')
    r.call_function(with some arguments)

    #Some Operations
    del r
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target = R_worker, args=(i,))
        jobs.append(p)
        p.start()
于 2013-02-12T01:50:14.747 に答える