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