Как правильно избежать системных вызовов изнутри R


У меня есть несколько команд оболочки, которые я хочу запустить в R.

Я попробовал system (), Но я не нашел, как сделать правильный побег, даже используя shQuote.

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

Но как я выполняю команду типа perl -e 'print "testn"' или curl --data-urlencode query@biomart.xml http://biomart.org/biomart/martservice/results внутри R?

Обновление:

В случае команд, подобных примеру perl, я не знаю, как выполнить экранирование кавычек, поскольку он должен быть заключен в кавычки в виде строки, но уже использую оба типа кавычек.

В случае скручивания проблема, по-видимому, заключается в спокойном вызове для передачи xml с@, который работает в оболочке, но не в вызове system ()

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

Предупреждение: не удалось прочитать данные из файла " query@biomart.xml", это делает пустой Предупреждение: пост.

Файл называется biomart.xml не запрос@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>
1 3

1 ответ:

Строки в R могут быть заключены в одинарные (') или двойные (") кавычки.

Если вы хотите выполнить команду с одинарными и двойными кавычками, например:

perl -e 'print "test\n"'

Тогда это не имеет большого значения, что вы выбираете для своей строки R-поскольку одна пара должна быть экранирована в любом случае.

Допустим, вы выбрали одинарные кавычки:

system('')

Тогда нам нужно экранировать одинарные кавычки таким же образом, как и для символа новой строки, с помощью escape-символа, \:

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

Таким же образом можно кодировать символы Unicode с помощью \Unnnnnnnn или \unnnn. Альтернативно с восьмеричным (\nnn) или шестнадцатеричным (\xnnn).

Таким образом:

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

Если @ в вашей команде curl вызывает проблему, кодирование его, как это должно исправить это.