为什么重定向运算符在 R 的 system() 调用中被解释为文件?



简单的命令,如:system(command = "cat file1 > file2")

产生错误:/usr/bin/cat: >: No such file or directory

这意味着>被解释为一个文件。为什么会发生这种情况,我该如何避免?我在Windows 10 Rstudio R 4.0上运行此程序。毫无价值的是,命令本身工作良好,就像在system("cat file1")中一样,将预期的内容打印到stdout。

运行时

cat file1 > file2

您正依靠shell为您执行重定向。当你在linux机器上运行system()时,它会为你创建一个shell,但当你在Windows上使用system()时,它不会运行完整的shell,它只是尝试执行命令。因此,您需要使用shell()

shell(command = "cat file1 > file2")

?system帮助页面的"备注"部分将对此进行进一步讨论。

(这个答案主要是作为Flick先生建议使用shell的替代方案。(

CCD_ 10的不良略低于CCD_ 11。一种稍微好一点的方法是,它允许在参数中进行重定向,使用stdout=stderr=参数。这就是你的命令:

system2("cat", "file1", stdout = "file2")

不过,要小心,R的system命令对于除了最简单的命令序列(或最偏执的命令序列(之外的所有命令来说都是非常危险的。为了进行比较,

  • system()采用单个字符串,使调用者处理任何引用;

  • system2()允许您提供一个论点向量,对我来说暗示它将处理引用等。。。但来源:

    command <- paste(c(shQuote(command), env, args), collapse = " ")
    

    它只保护命令本身,使其余args的空间盲目地塌陷。

另一种选择是使用processx包来运行命令,因为它为您处理所有这些。。。以及其他一些安全措施和提示。