使用系统中的多个命令从R调用外部程序

时间:2014-02-23 09:02:42

标签: r shell command-line external-process

我是编程新手,主要是我能在R中做一些脚本,但对于我的工作,我需要调用一个外部程序。要使这个程序在ubuntu的终端上工作,我必须首先使用setenv,然后执行程序。谷歌搜索我发现了system()和Sys.setenv()函数,但不幸的是我可以使它发挥作用。

这是在ubuntu终端中运行的代码:

$ export PATH=/home/meme/bin:$PATH
$ mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp

如果前两个参数是输入文件,则-o参数是输出目录,-comp是程序运行的另一个参数。

我需要在R中执行此操作,尽管它已在终端中运行,因为我需要使用1000个不同的文件运行程序1000次,所以我想创建一个for循环,其中输入名称在每个循环中都会更改然后分析R中的每个输出。

我已经尝试过使用:

Sys.setenv(PATH="/home/meme/bin"); system(mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp )

system(Sys.setenv(PATH="/home/meme/bin") && mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp )

但总是收到:

Error: unexpected constant string in "system(mast "/home/meme/meme.txt""

Error: unexpected symbol in "system(Sys.setenv(PATH="/home/meme/bin") && mast "/home/meme/meme.txt""

此时我已经没有想法让这项工作成功。如果这已经得到了回答,那么我的谷歌搜索功能一直很差,我希望能够回复任何链接。

非常感谢你的时间。

卡洛斯

其他详情:

我使用Ubuntu 12.04 64位版本,RStudio版本0.97.551,R版本3.0.2(2013-09-25) - “Frisbee Sailing”平台:x86_64-pc-linux-gnu(64位) 。 我使用的程序(MAST)在字母列表中找到序列模式,并且是http://meme.nbcr.net/meme/doc/meme-install.html中找到的MEME SUIT版本4.9.1的一部分,并通过命令行运行。 mast的命令行用法是:

mast    <motif file> <sequence file> [options]

1 个答案:

答案 0 :(得分:9)

使用paste构建要执行的字符串,并将其提供给system

for(i in 1:10){
cmd=paste("export FOO=",i," ; echo \"$FOO\" ",sep='')
system(cmd)
}

请注意使用sep=''来阻止paste将空格放入,并在字符串中引用引号以保留它们。

使用print(cmd)代替system(cmd)进行测试,以确保您正在构建正确的命令。也许这样做:

if(TESTING){print(cmd)}else{system(cmd)}

并在运行前在R中设置TESTING=TRUEFALSE

如果要在每个system调用中运行多个shell命令,最好将它们全部放在一个shell脚本文件中并调用它来代替,从R中传递参数。例如:< / p>

cmd = paste("/home/me/bin/dojob.sh ",i,i+1)
system(cmd)

然后dojob.sh是一个解析args的shell脚本。你需要学习更多的shell脚本。