打开 R 的新实例并在该实例中获取脚本

Opening a new instance of R and sourcing a script within that instance

Background/Motivation: 我正在 运行 建立一个生物信息学管道,如果从头到尾线性执行,需要几天才能完成。幸运的是,有些任务并不相互依赖,因此可以单独执行。例如,任务 2、3 和 4 都依赖于任务 1 的输出,但彼此不需要信息。任务 5 使用 2、3 和 4 的输出作为输入。

我正在尝试编写一个脚本,该脚本将为三个任务中的每一个打开新的 R 实例,并同时 运行 它们。一旦这三个都完成,我就可以继续剩下的管道。

我过去所做的是,对于更线性的工作流程,有一个 "master" 脚本依次获取 (source()) 每个任务的下标。

我已搜索过 SO 和 google,但未能找到针对此特定问题的解决方案。希望你们能帮忙。

在 R 中,您可以 运行 system() to invoke commands within a terminal and open 打开文件。例如,以下将打开一个新的终端实例:

system("open -a Terminal .",wait=FALSE)

同样,我可以使用

启动一个新的 r 会话
system("open -a r .")

我一辈子都想不通的是如何设置 "input" 参数,使其成为我的一个脚本的来源。例如,我希望以下内容打开一个新的终端实例,在新实例中调用 r,然后获取脚本。

system("open -a Terminal .",wait=FALSE,input=paste0("r; source(\"/path/to/script/M_01-A.R\",verbose=TRUE,max.deparse.length=Inf)"))

在其他人感兴趣的情况下回答我自己的问题。

经过几天的努力,我认为执行此工作流程的最佳方式是不要将自己局限于只在 R 中工作。编写 bash 脚本提供了更大的灵活性,并且可能更直接的解决方案。以下示例是在另一个网站上向我推荐的。

#!/bin/bash

# Run task 1
Rscript Task1.R

# now run the three jobs that use Task1's output
# we can fork these using '&' to run in the background in parallel
Rscript Task2.R &
Rscript Task3.R &
Rscript Task4.R &

# wait until background processes have finished
wait %1 %2 %3

Rscript Task5.R

您可能对 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。创造未来的原因之一是并行/分布式进行大规模生物信息学。