我有几个要在 R 中运行的 shell 命令。
我试过 system() 但我还没有找到如何进行正确的转义,即使是使用 shQuote。
# works OK
system('ls -a -l')
但我如何执行像 perl -e 'print "test\n"'
或 curl --data-urlencode query@biomart.xml http://biomart.org 这样的命令/biomart/martservice/results
在 R 中?
更新:
对于像 perl 示例这样的命令,我不知道如何转义引号,因为它需要作为字符串引用,但已经使用了两种类型的引号。
在 curl 的情况下,问题似乎出在 RESTful 调用中以在 shell 中有效但在 system() 调用中无效的 @ 传递 xml
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.
文件是 biomart.xml 不是 query@biomart.xml
** 更新 2**
我用于测试的 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>
最佳答案
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
命令中的 @
导致了问题,像这样编码应该可以解决问题。
关于r - 如何正确地从 R 内部转义系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985481/