Использование функции system () в R - PullRequest
1 голос
/ 15 марта 2020

Я запускаю новый скрипт на R и пытаюсь вызвать файл .exe с помощью функции system () из r. Я бегу:

system("C:/Program Files (x86)/OxMetrics6/ox/bin/oxl.exe I:/Code R/GarchOxModelling.ox", show.output.on.console = TRUE, wait = TRUE)

Но кажется, что ничего не делать. И когда я запускаю вручную файл GarchOxModelling.ox, он работает. Не могли бы вы знать, как заставить его работать с R?

Заранее спасибо

1 Ответ

1 голос
/ 15 марта 2020

Без тестирования попробуйте

ret <- system(paste(shQuote("C:/Program Files (x86)/OxMetrics6/ox/bin/oxl.exe"),
                    shQuote("I:/Code R/GarchOxModelling.ox")),
              show.output.on.console = TRUE, wait = TRUE)

Несколько проблем с кодом, который вы указали в своем вопросе:

  1. Это синтаксически неправильно R:

    "system(C:/Program Fil...", show.output.on.console = TRUE, wait = TRUE)
    

    - это все равно, что набирать

    "ABC", x=1, y=2)
    

    , что должно привести к ошибке.

  2. Даже если предположить, что лидирующая цитата неверна, вам нужно начать цитату в начале имени исполняемого файла, как в

    system("C:/Program File...", ...)
    
  3. Кроме того, это то, что это передается дословно в оболочку. Хотя что-то windows правильно угадывает о встроенных пробелах, на самом деле не стоит полагать, что это может происходить постоянно, поэтому вам следует вручную цитировать все свои аргументы, которые либо (a) содержат пробел, либо (b ) вы не знаете, потому что они являются переменными. В этом случае я предпочитаю shQuote, но dQuote может быть достаточно.

    system(paste(shQuote("C:/Program Files (x86)/OxMetrics6/ox/bin/oxl.exe"),
                 shQuote("I:/Code R/GarchOxModelling.ox")),
           show.output.on.console = TRUE, wait = TRUE)
    
  4. I предлагает , который вы рассматриваете, используя intern=TRUE вместо show.output..., так что вы можете, возможно, программно проверить, что результат соответствует ожидаемому.

  5. Последнее предложение, я считаю, что пакет processx гораздо более надежен для такие звонки,

    # library(processx)
    ret <- processx::run("C:/Program Files (x86)/OxMetrics6/ox/bin/oxl.exe", "I:/Code R/GarchOxModelling.ox")
    

    , где цитирование обрабатывается автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...