我正在尝试在 R 中设置一个异步 system() 调用。为了使它有用,用户需要一种方法来检查进程是否已经结束。问题是如何测试?在如何运行可执行文件,然后在 Windows 中使用 R 杀死或终止相同的进程时,建议似乎是在 system() 调用之前和之后捕获所有 pid 以获取刚刚启动的进程的 pid (然后可以用来测试它是否已经结束),但这似乎是一种容易出错的方法,而且它依赖于操作系统......
是否有其他方法可以解决此问题(不必涉及 pid)
编辑:这应该用于当前场景:
我正在开发一个 Shiny GUI,它可以处理在 Java 中实现的可能很长时间运行的计算。计算是分批完成的,在这些运行期间,即使 R 空闲,GUI 也被锁定,无法与 R 服务器交互,因为它正在等待 Java 进程完成。我想要一种方法来启动 Java 进程而不是等待它完成(使用 wait=FALSE 参数),而是有一种检查它是否已完成的故障安全方法,因此可以相应地更新 GUI...
ags*_*udy -3
R甚至不支持多线程系统。所以异步调用它不会很容易。一种方法是通过支持异步调用的语言来调用它。例如蟒蛇:
这是一个完整的示例,异步调用 2 个 R 函数:
这是一个虚拟示例,但它足够灵活,可以扩展到任何 R 脚本。
from twisted.internet.defer import Deferred
from twisted.internet import reactor
import rpy2.robjects as robjects
## define the functions
def get_perimeter(r):
robjects.r('''
f <- function(r) {
Sys.sleep(sample(1:3,1))
2 * pi * r
}
''')
r_f = robjects.r['f']
print r_f(r)
return r_f(r)
def get_radius(p):
robjects.r('''
f <- function(p) p/2 / pi
''')
r_f = robjects.r['f']
print r_f(p)
return r_f(p)
def job_done(_):
from twisted.internet import reactor
reactor.stop()
## the asynchronous call
d = Deferred()
d.addCallback(get_perimeter)
d.addCallback(get_radius)
d.addCallback(job_done)
reactor.callWhenRunning(d.callback, 25410)
reactor.run()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1413 次 |
| 最近记录: |