我的目标是重复运行 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()) )])
读取这些内容并调度 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
行。假设你在一个类 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/