通过 `system(..)` 使用 R 中的 `diff`
Using `diff` from R via `system(..)`
我愿意使用 Bash
中的 diff
命令比较 R
中的两条路径(名为 a
和 b
)。
在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
我愿意使用 Bash
中的 diff
命令比较 R
中的两条路径(名为 a
和 b
)。
在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