2016-08-24 21 views
2

我愿意使用Bashdiff命令比较R中的两条路径(命名为ab)。通过`system(..)'使用来自R的'diff`

在bash我就从R请勿

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

所以我想

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')" 
) 
) 

OR

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

但都返回一个错误。

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()函数时出了什么问题,以及如何解决它。

+0

我不认为'/斌/ sh'支持'<('进程替换,你可以得到在'bash'工作。 – r2evans

回答

0

如解释here,system(..)未运行/usr/bin/bash而是/usr/bin/sh。这里有两个可能的解决方案。

解决方案“USR/bin/sh的”

因此,为了使通过/usr/bin/sh运行的脚本,我不得不对文件打印字符串。在 “USR /斌/庆典”

的替代和更好的溶液

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,")")) 
    } 
} 

解决办法是明确给出的命令是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