如何正确地从R内部转义系统调用

时间:2014-09-23 01:27:19

标签: r system-calls

我想在R中运行几个shell命令。

我已经尝试过system()但是我还没有找到如何使用shQuote进行正确的转义。

# works OK
system('ls -a -l')

但我如何在R?

中执行perl -e 'print "test\n"'curl --data-urlencode query@biomart.xml http://biomart.org/biomart/martservice/results之类的命令

更新

对于像perl这样的命令,我不知道如何转义引号,因为它需要引用为字符串,但已经使用了两种类型的引号。

在curl的情况下,问题似乎是在RESTful调用中传递xml与@在shell中工作但不在system()调用中

dat <-system('curl  --data-urlencode query@biomart.xml http://biomart.org/biomart/martservice/results', intern=F)
  

警告:无法从文件&#34; query@biomart.xml"中读取数据,这会使其为空   警告:POST。

该文件是biomart.xml而不是query@biomart.xml

** Update2 **

我用于测试的xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Query>
<Query virtualSchemaName = "default" formatter = "TSV" header = "0" uniqueRows = "0" count = "" datasetConfigVersion = "0.6" >

<Dataset name = "hsapiens_gene_ensembl" interface = "default" >
  <Filter name = "hgnc_symbol" value = "LDLR"/>
  <Attribute name = "external_gene_id" />

</Dataset>
</Query>

2 个答案:

答案 0 :(得分:3)

R中的字符串可以用单引号(')或双引号(")括起来。

如果要使用单引号和双引号执行命令,例如:

perl -e 'print "test\n"'

那么你为R字符串选择的结果不大 - 因为一对需要以任何方式进行转义。

假设您选择单引号:

system('')

然后我们需要以与换行符相同的方式转义单引号,并使用转义字符\

command <- 'perl -e \'print "test\n"\''
system(command)

也可以使用\Unnnnnnnn\unnnn以这种方式对Unicode字符进行编码。或者使用八进制(\nnn)或十六进制(\xnnn)。

因此:

atSymbol <- '\u0040' # '\x040' '\100'

如果@命令中的curl导致问题,那么对其进行编码应该可以解决问题。

答案 1 :(得分:0)

在此示例中,除了转义'外,我还必须转义\\(使用\\\\),\.\G,{{1 }},但没有\K

\n