2016-08-24 88 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