我是编程新手,主要是我能在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]
答案 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=TRUE
或FALSE
。
如果要在每个system
调用中运行多个shell命令,最好将它们全部放在一个shell脚本文件中并调用它来代替,从R中传递参数。例如:< / p>
cmd = paste("/home/me/bin/dojob.sh ",i,i+1)
system(cmd)
然后dojob.sh
是一个解析args的shell脚本。你需要学习更多的shell脚本。