从bash脚本中生成并执行R,Python等脚本

时间:2015-11-17 23:26:00

标签: python r bash

我一直试图找到解决方案一段时间,但尚未发现任何令人满意的事情。我编写了很多bash脚本,但有时我想使用R或Python作为脚本的一部分。现在,我最终不得不写两个脚本;原始bash脚本执行任务的前半部分,而R或Python脚本执行后半部分任务。我在bash脚本中调用R / Python脚本。

我对这个解决方案不满意,因为它将我的程序分成两个文件,这增加了事情不同步的机会,更多的文件要跟踪等等。有没有办法写一个包含的文本块我的整个R / Python脚本,然后将bash吐出到一个文件中并将参数传递给它&执行它?有更简单的解决方案吗?这比将简单的单行传递给R / Python更复杂,因为它通常涉及通过几个步骤创建和操作对象。

2 个答案:

答案 0 :(得分:8)

可能有很多解决方案,但这个解决方案有效:

#!/bin/bash
## do stuff
R --slave <<EOF
  ## R code
  set.seed(101)
  rnorm($1)
EOF

如果您希望灵活地将额外的bash参数传递给R,我建议:

#!/bin/bash
## do stuff
R --slave --args $@ <<EOF
  ## R code
  set.seed(101)
  args <- as.numeric(commandArgs(trailingOnly=TRUE))
  do.call(rnorm,as.list(args))
EOF
  • 这允许灵活数量的参数,但假设它们都是数字
  • 它还假设所有参数都将从bash脚本传递到R子脚本
显然你可以放松这些,例如从位置参考参数

答案 1 :(得分:6)

这是python的一个示例,类似于Ben Bolker的回答

#!/bin/bash
python << EOF
print 'Hello $1'
EOF

输出:

> sh test.sh "world"

Hello world

-----------------------------------------------

您也可以将变量从bash传递到python:

for ((i=1;i<=$1;i++)) do
python << EOF
print 'Hello world $i times'
EOF
done

输出:

> sh test.sh 5

Hello world 1 times
Hello world 2 times
Hello world 3 times
Hello world 4 times
Hello world 5 times

为正常工作导入pandas,numpy,matplotlib和其他工作正常。