system2 () в R 3.5 игнорирует параметр stdout - PullRequest
0 голосов
/ 30 ноября 2018

Я недавно обновился с R 3.4.3 до R 3.5.1

Мое приложение выполняет вызов system2 (), который работает в 3.4.3 как для Windows, так и для Linux, но больше не работает в 3.5.1 Windows (но все еще работает в Linux).В частности, мой вызов system2 () перенаправляет стандартный вывод в файл, однако в Windows 3.5.1 он не перенаправляет, а отправляет вывод на консоль.

Кто-нибудь имеет опыт работы с этой проблемой?Я не нашел никаких заметок об изменении того, как 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"

Выход из 3.5.1 на windows:

> 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

Выход из 3.5.1 на linux:

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

1 Ответ

0 голосов
/ 30 ноября 2018

Мне удалось воспроизвести это с помощью RGui с исправленным R 3.5.1 - я подал это как отчет об ошибке для основной команды 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...