Как правильно избежать системных вызовов изнутри 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)
Файл называется biomart.xml не запрос@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>
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
вызывает проблему, кодирование его, как это должно исправить это.