这将是一个很长的问题。所以,请原谅我

我有以下情况,我想最好提供一个伪代码来更好地解释事物

一个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中对函数测试的调用发生在某些值'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删除所有与引用类相关的方法和对象?

最佳答案

从R的全局环境中删除所有对象并不意味着您将返回到刚开始的R进程(如发现的那样,类和方法定义可能会保留)。

可以考虑使用R函数(例如removeClass()removeMethod()removeGeneric),但除非有客观要求(例如避免一遍又一遍地加载大对象),否则每次创建R进程可能只是最安全的方法(启动R进程相对较快)。

由于无法终止和重新启动嵌入式R(限制来自R,而不是rpy2),因此您必须启动和停止嵌入R的Python进程。

一种方法是使用Python包multiprocessing(包含在Python的标准库中)。另外一个好处是这些进程可以并行运行。

Doug Hellmann's excellent tutorial为基础的简单示例:

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()

关于python - 如何删除引用类的方法和R中的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14823263/

10-11 06:08
查看更多