R中system()命令中的括号

时间:2015-09-25 01:48:01

标签: r bash

我一直在努力寻找一种在R中运行这一行(在bash中工作)的方法,并且我不断收到有关圆括号的错误...我明白粘贴命令在处理括号时会感到困惑,但我已经尝试转义括号,将它们放在双引号中,如“')'”,但没有任何作用,所以我没有资源。有没有人知道这在R中是如何起作用的?

system(paste("sortBed -i <(awk -v a=1 -v b=2 -v c=3 -v d=4 '{OFS=FS=\"\t\"} {if ($d < 0.5) print \"value\"$a, $b-\"'$d'\", $c+\"'$d'\"}' file.in > file.out", sep=""))

sh: -c: line 0: syntax error near unexpected token `('

2 个答案:

答案 0 :(得分:3)

原因似乎是R system()命令调用bourne shell(sh)而不是bourne again shell(bash)。例如,命令

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (!dgv.Columns[e.ColumnIndex].ReadOnly)
    {
        e.CellStyle.BackColor = Color.Yellow;
    }
}

会失败,在此过程中提到bourne shell:

> system("paste <(echo 'Hi')")

一种解决方案是在bourne shell中打印命令并将输出传递给bash:

sh: -c: line 0: syntax error near unexpected token `('

答案 1 :(得分:0)

我从R运行该行时得到的错误与我相同。据我所知,在bash脚本中缺少输出进程替换的最后一个括号,但添加它不会阻止错误。也应该对制表符进行双重转义,以确保反斜杠传递到awk脚本。

我们在这种情况下发现的一个解决方案是将awk的输出直接导入sortBed

system(paste("awk -v a=1 -v b=2 -v c=3 -v d=4 '{OFS=FS=\"\\t\"} {if ($d < 0.5) print \"value\"$a, $b-\"'$d'\", $c+\"'$d'\"}' file.in | sortBed -i", sep=""))

我们并没有真正让输出流程替换工作,所以如果有人对此有任何建议,那将会很高兴听到。