我正在Rstudio中进行一些生物信息学分析,但是使用system()时会发生一些奇怪的事情。我还使用Linux的Windows子系统,因此可以在Windows cmd 中运行UNIX可执行文件,如下所示:
bash -c "./parasail-master/build/parasail_aligner -a sw_trace_striped_sat -f SSWtemplate.fa -q SSWtest.fa -O EMBOSS -d >OUT.txt"
不用担心细节:重要的是,我使用 bash -c 表示我要使用UNIX bash,并且我正在运行可执行文件parasail_aligner。一切顺利,我得到了漂亮的输出文件“ OUT.txt”。
现在,由于我正在Rstudio中进行分析,因此我想直接从R脚本执行此操作,就像这样:
system('bash -c "./parasail-master/build/parasail_aligner -a sw_trace_striped_sat -f SSWtemplate.fa -q SSWtest.fa -O EMBOSS -d >OUTER.txt"')
因此:只需将其作为 system()的参数?但这会产生以下错误:
input file, query file, and stdin detected; max inputs is 2
这显然是由parasail_aligner专门生成的错误。有趣的是:我根本没有直接从cmd收到此错误,但是在使用system()在R中运行命令时确实得到了此错误。有谁知道为什么会发生这样的事情?我希望system()仅将其参数提供给cmd,但显然它不会这样做...在Rstudio中打开的命令终端中运行命令也可以正常工作,特别是system()似乎混乱了
如果这个问题含糊不清,我感到非常抱歉,但是我不能给您一个简单的示例,您可以使用该示例来复制错误。我已经使用system()一段时间了,而且从未遇到过此类问题。我在Windows上,我在网上发现有人说您应该使用shell()而不是system(),但是这样做只会给我同样的错误。
也许我不知道该错误所涉及的“ stdin ”问题以及R / RStudio如何处理此问题。但是parasail似乎认为我给它一个额外的输入“ stdin”:是的,我确实提供了一个输入文件和一个查询文件(请参阅错误消息),但是我不知道这个“ stdin”是什么。
如果任何人对system()的这种奇怪行为背后可能有什么想法,我都很听。我知道帮助我很困难,因为我无法举一个简单的例子来说明问题的发生,但是我希望有人总能知道是什么问题
更新(answer?):因此,我设法解决了该问题,就像这样:
system('bash -c "./parasail-master/build/parasail_aligner -a sw_trace_striped_sat < SSWtemplate.fa -f SSWtest.fa -O EMBOSS -d >OUTER.txt"')
我做了一些关于stdin的搜索,(请原谅我,如果我说的听起来很业余,我对UNIX或命令行不是很熟悉)发现它的“符号”是 << / strong>。因此,您可以在上面的代码中看到,我更改了输入“ SSWtemplate”和“ SSWtest”的输入方式,使用“ <”输入其中之一,从而解决了问题。
我不知道为什么会这样。特别是因为它仅在从RStudio内部调用命令时发生,而从cmd调用时则不会发生。如果任何人都可以进一步阐明这一点(即为什么system()和shell()之类的功能以及为什么似乎与stdin混淆),那将是一个很大的帮助。否则,我只会回答我自己的问题,然后就此解决。