R и системные вызовы

Я использовал R в прошлом, чтобы делать очень простые вызовы линии commmand. Пример можно найти здесь.

На этот раз я ищу, чтобы имитировать этот код, который успешно запускается из командной строки в Windows:

> cd C:\Documents and Settings\BTIBERT\My Documents\My Dropbox\Eclipse\Projects\R\MLB\retrosheet\rawdata
> bgame -y 2010 2010bos.eva >2010bos.txt

Это код, который я пытаюсь запустить внутри R. Я уже установил рабочий каталог внутри R.

dir <- paste("cd", getwd(), sep=" ")
system(dir)
system("bgame -y 2010 2010bos.eva >2010bos.txt")

Я уверен, что это ошибка пользователя, но что я делаю неправильно? Похоже, что он работает, но возвращает следующую ошибку. Я очень хорошо мог делать что-то неправильно, но я считаю, что я использую те же команды.

Expanded game descriptor, version 109(185) of 05/08/2008.
  Type 'bgame -h' for help.
Copyright (c) 2001 by DiamondWare.
[Processing file 2010bos.eva.]
>2010bos.txt: can't open.
Warning message:
running command 'bgame -y 2010 2010bos.eva >2010bos.txt' had status 2 

Любая помощь, которую вы можете предоставить, будет оценена.

Ответ 1

Вам нужно выдать все команды за один вызов system():

system(paste("cd",getwd() "&& bgame -y 2010 2010bos.eva >2010bos.txt",sep=" "))

Вы уже должны быть в своем рабочем каталоге, поэтому я не уверен, что требуется cd getwd(). И вам может понадобиться кавычки вокруг вашего пути, потому что они содержат пробелы. Ошибка может быть решена путем помещения пробелов вокруг >.

Если бы я был на твоем месте, я бы попробовал это:

system("bgame -y 2010 2010bos.eva > 2010bos.txt")

UPDATE:

И вы должны, вероятно, прислушаться к этому совету в разделе "Различия между Unix и Windows" ?system, в котором говорится, что вы должны использовать shell:

    • The most important difference is that on a Unix-alike
      ‘system’ launches a shell which then runs ‘command’.  On
      Windows the command is run directly - use ‘shell’ for an
      interface which runs ‘command’ _via_ a shell (by default the
      Windows shell ‘cmd.exe’, which has many differences from the
      POSIX shell).

      This means that it cannot be assumed that redirection or
      piping will work in ‘system’ (redirection sometimes does, but
      we have seen cases where it stopped working after a Windows
      security patch), and ‘system2’ (or ‘shell’) must be used on
      Windows.

Ответ 2

Никому еще не найдено, что system("dir", intern = T), например, не работает, но вам нужно system("cmd.exe /c dir", intern = T)? Только последний работает для меня. Я нашел это на обсуждаемом сайте здесь (сообщение Уильяма Данлапа, примерно треть пути вниз).

Кроме того, он не работает с командой "cd", но вы можете использовать функцию setwd() внутри R, а затем команда будет выполнена в этом каталоге.

Я создал следующие функции для удобства, для выполнения программ и запущенных команд:

#the subject is an input file that a programme might require
execute <- function(programme, subject.spec = "", intern = FALSE, wait = FALSE){
  if(!identical(subject.spec, "")){subject.spec <- paste0(" ", subject.spec)} #put space before the subject if it exists
  system(paste0("cmd.exe /c ", programme, subject.spec), intern = intern, wait = wait)
}


command <- function(command, intern = TRUE, wait = FALSE){
  system(paste("cmd.exe /c", command), intern = T, wait = wait)
}

Ответ 3

Разрывает ли ваш код код при получении ошибки 1 или выполнение продолжается?

Всякий раз, когда выполнение команд системы с помощью другого языка полезно распечатать системный вызов, прежде чем вы вызовете его, чтобы увидеть, что именно происходит, вытащите оболочку, которую вы собираетесь использовать, и проверьте ее на ту же ошибку. Поскольку команда выполняется правильно, это может быть hickup в bgame или R.

Если вы посмотрите http://astrostatistics.psu.edu/datasets/R/html/base/html/shell.html, вы можете увидеть флаг переменной, переданный системному вызову. "поставьте флаг для запуска команды в оболочка. Если оболочка bash или tcsh, значение по умолчанию изменено на" -c "."

Также" используемая оболочка может быть изменена путем установки переменной конфигурации R_SHELL на подходящее значение (полный путь к оболочке, например/usr/local/bin/ bash).