How to correctly escape system calls from inside R

那年仲夏 提交于 2019-12-12 17:05:22

问题


I have several shell commands that I want to run in in R.

I have tried system() but I have not find out how to do the right escaping even using shQuote.

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

but how I execute a command like perl -e 'print "test\n"' or curl --data-urlencode query@biomart.xml http://biomart.org/biomart/martservice/results inside R?

update:

In the case of commands like the perl example I do not know how to do the escaping of quotes as it needs to be quoted as string but already use both types of quotes.

In the case of curl, the problem seems to be in the RESTful call to pass the xml with the @ that works in the shell but not in the system() call

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

Warning: Couldn't read data from file "query@biomart.xml", this makes an empty Warning: POST.

The file is biomart.xml not query@biomart.xml

** Update2**

The xml file I am using for test is:

<?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>

回答1:


Strings in R may be enclosed in either single (') or double (") quotes.

If you want to execute a command with both single and double quotes, such as:

perl -e 'print "test\n"'

then it is of little consequence which you choose for your R string - since one pair needs to be escaped either way.

Let's say you choose single quotes:

system('')

Then we need to escape the single quotes in the same way as for the newline character, with the escape character, \:

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

It is also possible to encode Unicode characters in this way with \Unnnnnnnn or \unnnn. Alternatively with octal (\nnn), or hex (\xnnn).

Thus:

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

If the @ in your curl command is causing the problem, encoding it like this should fix it.



来源:https://stackoverflow.com/questions/25985481/how-to-correctly-escape-system-calls-from-inside-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!