这将是一个非常长的问题。所以,原谅我
我有以下情况,我想最好给出一个伪代码来更好地解释
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'的某些值上,即函数被调用为i的某些值,它总是大于1,即函数从 main >被多次调用STRONG>。因此,我们不止一次地获取R文件。每次调用python函数时我都想要一个新的R解释器。因此,每次调用函数时都会导入r并删除rpy2对象。
在r函数“call_function”中,我调用了一些方法,这些方法又创建了引用类对象。
在R代码中,我在代码的开头使用rm,并且在函数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删除与引用类相关的所有方法,对象?
答案 0 :(得分:4)
从R的全局环境中删除所有对象并不意味着您回到刚刚启动的R进程(类和方法定义可能会保留,如您所发现的那样)。
可以考虑使用removeClass()
,removeMethod()
或removeGeneric
等R函数,但除非有客观要求(例如避免反复加载大型对象) ,每次创建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()