背景/动机: 我正在运行一个生物信息学管道,如果从头到尾线性执行需要几天才能完成。幸运的是,有些任务并不相互依赖,因此可以单独执行。例如,任务2,3和4都取决于任务1的输出,但不需要彼此的信息。任务5使用2,3和4的输出作为输入。
我试图编写一个脚本,为三个任务中的每个任务打开R的新实例并同时运行它们。一旦完成所有三个,我可以继续使用剩余的管道。
我过去所做的事情,对于更多线性工作流程,有一个" master"脚本(source())依次来源(source())每个任务的下标。
我已经搜索了SO和google并且没有能够找到解决此特定问题的方法。希望你们能提供帮助。
在R中,您可以运行system()来调用终端中的命令,并open来打开文件。例如,以下将打开一个新的终端实例:
system("open -a Terminal .",wait=FALSE)
同样,我可以使用
开始一个新的r会话system("open -a r .")
我能为我的生活找到的是如何设置"输入"参数,以便它来源我的一个脚本。例如,我希望以下内容打开一个新的终端实例,在新实例中调用r,然后获取脚本。
system("open -a Terminal .",wait=FALSE,input=paste0("r; source(\"/path/to/script/M_01-A.R\",verbose=TRUE,max.deparse.length=Inf)"))
答案 0 :(得分:1)
如果其他人对此感兴趣,请回答我自己的问题。
经过几天的研究,我认为实现这个工作流程的最佳方式是不限制自己只在R中工作。编写一个bash脚本提供了更大的灵活性,可能是一个更直接的解决方案。我在另一个网站上向我建议了以下示例。
background-image:url('/path/to/image.jpg');
background-repeat: no-repeat;
background-position: center center;
background-attachment: fixed;
background-size: cover;
答案 1 :(得分:1)
您可能对future package感兴趣(我是作者)。它允许您将代码编写为:
library("future")
v1 %<-% task1(args_1)
v2 %<-% task2(v1, args_2)
v3 %<-% task3(v1, args_3)
v4 %<-% task4(v1, args_4)
v5 %<-% task5(v2, v3, v4, args_5)
每个v %<-% expr
语句都基于R表达式expr
(及其所有依赖项)创建未来,并将其分配给承诺v
。只有在使用v
时,它才会阻止并等待值v
可用。
这些期货的解析方式和地点由上述代码的用户决定。例如,通过指定:
library("future")
plan(multiprocess)
在顶部,然后期货(=不同的任务)在本地机器上并行解决。如果你使用,
plan(cluster, workers = c("n1", "n3", "n3", "n5"))
他们已经在机器上解决(其中n3
接受两个并发作业)。
这适用于所有操作系统(包括Windows)。
如果您可以访问带有调度程序(如Slurm,SGE和TORQUE / PBS)的HPC计算机,则可以使用future.BatchJobs package,例如
plan(future.BatchJobs::batchjobs_torque)
PS。创造未来的一个原因是并行/分布式地进行大规模生物信息学。