我的目标是重复运行 R 脚本,每次使用不同的参数集。

为此,我一直在使用 bash 脚本通过循环输入文件将命令行参数传递给 R 脚本,其中每行包含 7 个参数的不同组合。

输入文件如下所示:

10 food 0.00005 0.002 1 OBSERVED 0
10 food 0.00005 0.002 1 OBSERVED 240
10 food 0.00005 0.002 1 OBSERVED 480
10 food 0.00005 0.002 1 OBSERVED 720
10 food 0.00005 0.002 1 OBSERVED 960
10 food 0.00005 0.002 1 OBSERVED 1200

传递命令行参数的 R 脚本如下所示:
commandArgs(trailingOnly=FALSE)
A <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -6 )])
B <-             commandArgs()[as.numeric(length(commandArgs()) -5 )]
C <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -4 )])
D <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -3 )])
E <- as.numeric (commandArgs()[as.numeric(length(commandArgs()) -2 )])
F <-             commandArgs()[as.numeric(length(commandArgs()) -1 )]
G <- as.numeric (commandArgs()[as.numeric(length(commandArgs())    )])

读取这些并分派(dispatch) R 脚本的 bash 循环如下;
#!/bin/bash
N=0
cat Input.txt | while read LINE ; do
N=$((N+1))
echo "R --no-save < /home/trichard/Script.R" "$LINE" |  bsub  -N -q priority -R "select[model==Xeon5450]"
done

然而,问题是 Input.txt 中有数百万行,所以这种方法太慢了(它阻止其他 LSF 用户提交他们自己的作业)。

那么,问题是,如何使用 LSF 数组完成上述操作?

最佳答案

主要技巧是从输入文件中提取 n th 行。假设您使用的是类 Unix 系统,您可以使用“sed”命令来执行此操作。下面是一个例子:

N=$(wc -l < input.txt)
echo 'R --no-save -f Script.R --args $(sed "${LSB_JOBINDEX}q;d" input.txt)' |
  bsub -J "R_Job[1-$N]" -N -q priority -R "select[model==Xeon5450]"

在此示例中,正确引用参数有点棘手且非常重要。

请注意,这使用 R 的“--args”选项来避免有关无法识别的参数的警告消息。我还建议在 R 脚本中使用 commandArgs(trailingOnly=TRUE) 以便您只看到感兴趣的参数。

关于r - 在 LSF 中指定作业数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34422491/

10-12 20:33