R和Python之间的双向通信

Posted

技术标签:

【中文标题】R和Python之间的双向通信【英文标题】:Bidirectional communication between R and Python 【发布时间】:2014-05-23 09:55:04 【问题描述】:

我有一些内部使用回调的 Python 代码。我希望能够从 R 中调用此代码并让回调与 R 会话通信(例如,在回调中执行 R 代码)。基本上,Python 代码在调用时充当 R 的驱动程序。我不确定如何正确执行此操作。

像 RPy 和 rPython 这样的包似乎不能提供我需要的东西。 Python 代码在执行回调时需要保持特定状态,因此排除了从 R 中对 Python 函数的连续调用。

据我所知,唯一的解决方案是在 R 中启动一个 Python 子进程,然后让它们在必要时进行通信。通信将涉及这样的序列:

Python -> R:回调命令 R -> Python:回调结果

看了一堆备选方案后,我很难想出最佳的沟通策略(理想情况下是双向且独立于平台的):

    使用匿名管道。尽管R only seems to support pipes that read or write (not both),这对我来说似乎是最好的解决方案。 使用可以关闭和重新打开的命名管道以获得读取和写入功能。 R 会话将分别负责在调用 Python 之前和 Python 完成之后创建和删除命名管道。

我觉得我把事情复杂化了,但我想不出替代方案。有什么想法吗?

【问题讨论】:

例如为什么不使用rpy2?你在r objects中执行你的R代码。 @agstudy 如果我没记错的话,rpy2 运行一个嵌入式 R 进程。在我的用例中,我想在 R 回调中访问现有 R 工作区中的数据(例如,不创建嵌入在 Python 中的新 R 工作区)。这可以使用rpy2 来完成吗? 【参考方案1】:

答案是旧的,但如果有人需要无需安装的工具,请查看: https://github.com/jstar88/pyCommunicator

它可以按照你的要求进行通信和使用回调

【讨论】:

以上是关于R和Python之间的双向通信的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同进程中建立Activity和Service之间的双向通信?

在 C 中使用管道在父子之间创建双向通信

两个 django 应用程序之间的双向通信

TCL:Windows中线程之间的双向通信

父进程和外部子进程之间真正的非阻塞双向通信

swift项目中swift和objective-C之间的双向通信