如何检测含system命令的R函数执行完成后再启动下一个函数?
R脚本函数同步执行解决方案
出现该问题的核心原因是function1内部的system()调用采用了异步执行模式,R进程不会等待system()触发的bash命令执行完毕,就会直接向下执行function2,最终导致依赖缺失报错,可根据你是否能修改R包源码选择对应解决方案:
可修改R包函数源码
- 调整
system()参数配置:R原生system()函数默认wait = TRUE,即同步等待bash命令执行完毕再返回。如果包内函数的system()调用手动设置了wait = FALSE,或是调用的bash命令末尾添加了&让进程后台运行,调整对应配置即可:
# 原异步写法示例 system("bash task.sh &") system("bash task.sh", wait = FALSE) # 修改为同步写法 system("bash task.sh", wait = TRUE)
- 增加输出合法性校验:避免
system()执行异常生成不完整的输出,在function1执行完成后增加校验逻辑,确认输出正常再调用function2:
#!/usr/bin/env Rscript library(pkg) # 执行function1 func1_res <- function1() # 校验输出,假设function1输出为本地文件output.csv while (!file.exists("output.csv") || file.size("output.csv") == 0) { Sys.sleep(1) # 每1秒轮询一次输出状态 } # 校验通过后执行function2 function2(input = func1_res)
不可修改R包函数源码
- 固定时长等待:如果明确知道
function1的最长执行时长,可以在两个函数调用之间增加固定等待时间:
function1() Sys.sleep(60) # 单位为秒,可根据实际执行时长调整 function2()
- 输出轮询等待:该方案更稳妥,不需要提前预估执行时长,只要
function1的输出生成且合法就向下执行,复用上面的轮询校验逻辑即可。
内容的提问来源于stack exchange,提问作者darklings
相关产品推荐
相关产品推荐

