通过 `system(..)` 使用 R 中的 `diff`

Using `diff` from R via `system(..)`

我愿意使用 Bash 中的 diff 命令比较 R 中的两条路径(名为 ab)。

在bash我会做

$ a=Path/to/foo/directory/
$ b=Path/to/bar/directory/
$ diff <(printf ${a} | tr / '\n') <(printf ${b} | tr / '\n')
3c3
< foo
---
> bar

所以从 R 我正在尝试

a="Path/to/foo/directory/"
b="Path/to/bar/directory/"
system(
  paste0(
    "a=",a,
    ";b=",b,
    ";diff <(printf ${a} | tr / '\n') <(printf ${b} | tr / '\n')"
  )
)

system(
    paste0(
      "diff <(printf ",a," | tr / '\n') <(printf ",b," | tr / '\n')"
    )
  )

但是都return出错了。

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `a=Path/to/foo/directory/;b=Path/to/bar/directory/;diff <(printf ${a} | tr / ''

即使将 paste0 函数的输出复制粘贴到 bash 也能正常工作。

可能有更好的方法来比较 R 中的字符串,我欢迎其他解决方案。但是,我特别想了解我对 system() 函数的使用出了什么问题以及如何解决它。

所述,system(..)不是运行宁/usr/bin/bash而是/usr/bin/sh。这里有两种可能的解决方案。

"usr/bin/sh"

中的解决方案

因此,为了制作一个 运行 到 /usr/bin/sh 的脚本,我必须在文件上打印字符串。

DiffPath = function(a,b,ManipulationFolder="~")
{
  if (file.exists(ManipulationFolder))
  {
  system(
    paste0(
      "cd ",ManipulationFolder,
      ";a=",a,
      ";b=",b,
      ";printf ${a} | tr / '\n' > a.txt",
      ";printf ${b} | tr / '\n' > b.txt",
      ";diff a.txt b.txt",
      ";rm a.txt;rm b.txt"
    )
  ) 
  } else
  {
    warning(paste0("Cannot find the ManipulationFolder ( ",ManipulationFolder," )"))
  }
}

"usr/bin/bash"

中的解决方案

另一种更好的解决方案是明确将命令提供给 bash。

DiffPath = function(a,b)
{
  system(
    paste0(
      'bash -c \'diff <(printf ',a,' | tr / "\n") <(printf ',b,' | tr / "\n")\''
    )
  ) 
}

函数调用

a="Path/to/foo/directory/"
b="Path/to/bar/directory/"

DiffPath(a,b)
3c3
< foo
---
> bar