我最近从R 3.4.3升级到R 3.5.1
我的应用程序进行了一个system2()调用,该调用在Windows和Linux上都可以在3.4.3中使用,但不再在3.5.1 Windows中可以使用(但仍然可以在Linux中使用)。特别是,我的system2()调用将stdout重定向到文件,但是在R 3.5.1中的Windows上,它不重定向,而是将输出发送到控制台。
有人在这个问题上有经验吗?对于system2应该如何工作的更改,我没有发现任何注意事项。我是否错过了预期的行为更改?我可以使用任何解决方法来使其正常工作吗?
我创建了以下代码片段来演示该问题:
version$version.string
unlink("output.txt")
file.exists("output.txt")
system2("cmd", args = c("/c", "echo", "hello world"), stdout = TRUE)
system2("cmd", args = c("/c", "echo", "hello world"), stdout = "output.txt")
file.exists("output.txt")
readLines("output.txt")
3.4.3的输出:
> version$version.string
[1] "R version 3.4.3 (2017-11-30)"
> unlink("output.txt")
> file.exists("output.txt")
[1] FALSE
> system2("cmd", args = c("/c", "echo", "hello world"), stdout = TRUE)
[1] "hello world"
> system2("cmd", args = c("/c", "echo", "hello world"), stdout = "output.txt")
> file.exists("output.txt")
[1] TRUE
> readLines("output.txt")
[1] "hello world"
在Windows上3.5.1的输出:
> version$version.string
[1] "R version 3.5.1 (2018-07-02)"
> unlink("output.txt")
> file.exists("output.txt")
[1] FALSE
> system2("cmd", args = c("/c", "echo", "hello world"), stdout = TRUE)
[1] "hello world"
> system2("cmd", args = c("/c", "echo", "hello world"), stdout = "output.txt")
hello world
> file.exists("output.txt")
[1] FALSE
> readLines("output.txt")
Error in file(con, "r") : cannot open the connection
In addition: Warning message:
In file(con, "r") :
cannot open file 'output.txt': No such file or directory
Linux上3.5.1的输出:
> version$version.string
[1] "R version 3.5.1 (2018-07-02)"
> unlink("output.txt")
> file.exists("output.txt")
[1] FALSE
> system2("echo", args = c("hello world"), stdout = TRUE)
[1] "hello world"
> system2("echo", args = c("hello world"), stdout = "output.txt")
> file.exists("output.txt")
[1] TRUE
> readLines("output.txt")
[1] "hello world"
答案 0 :(得分:1)
我能够使用修补了R 3.5.1的RGui来重现此问题-我将其作为R核心团队的错误报告提交。 https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=17508
编辑:虽然我不确定这是否是故意的,但我相信这是负责更改的提交:
https://github.com/wch/r-source/commit/a0217674cba49d50a24dd42ea156f78687bd8de3
要适应行为上的变化,可以设置stderr
参数-例如,这应该起作用:
args <- c("/c", "echo", "hello")
system2("cmd", args = args, stdout = "output.txt", stderr = FALSE)