【问题标题】:How to remove methods of reference class and the objects in R如何删除引用类的方法和R中的对象
【发布时间】:2013-02-12 00:03:10
【问题描述】:

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

我有以下场景,我想最好给个伪代码来更好地解释事情

一个 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,即函数从 ma​​in 中多次调用强>。因此,我们不止一次地获取 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 删除与引用类相关的所有 methodsobjects

【问题讨论】:

  • 这听起来不像您为每次调用都创建一个新的 R 会话 - 这样做将是最简单的解决方法。
  • 这正是我想要的。如何使用 rpy2 为每次调用创建一个新的 R 会话?

标签: python r rpy2


【解决方案1】:

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

【讨论】:

  • 您好,感谢您的建议。这确实是一个非常好的解决方案。但是,我有不使用多线程或多处理的限制。本质上,我需要为每次调用创建一个新的 R 会话。该怎么做?
  • 一种方式或另一种方式(顺序或并行)您将不得不在每个需要的新 R 会话中使用一个进程。
  • 我添加了关于 R 的 removeClass() 和朋友的评论,但这可能是 R 代码库中使用较少的部分,您可能会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 2012-07-12
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多