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

标签 r system-calls

我有几个要在 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/

相关文章:

linux - 拼接系统调用,传递给管道的是什么?数据或行踪信息?

C - 使用暴力搜索 64 位 Linux 内核中的系统调用表

r - html Rmarkdown中上图的标题

r - pmin() 与 dplyr 在 R

r - 多模式搜索 - 从文档中选择命中率最高的行

R:从控制台获取最后的结果

c++ - 使用stat和lstat检测与文件有关的错误

linux - 禁用 GCC 优化后不会发生 __kernel_vsyscall() 崩溃

r - 在 ggplot2 上绘制世界地图

c - 如何在C中通过系统调用配置accept_local