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.
- Запуск командной строки молча с помощью VbScript и получение вывода?
- Как загружать чтение программы stdin и принимать параметры в gdb?
- Как получить команду сборки строки cmd для решения VS?
- Как определить строковый литерал в командной строке gcc?
- Запустите JAR-файл из командной строки и укажите путь к classам
dir 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
Любая помощь, которую вы можете предоставить, будет оценена по достоинству.
- Создайте приложение Android Studio через командную строку
- Оператор блокировки vs Метод Monitor.Enter
- Дамп базы данных mysql в резервную копию открытого текста (CSV) из командной строки
- Постройте несколько проектов CDT C ++ из командной строки
- Как разобрать аргументы командной строки в Java?
- Как запустить тестовые примеры JUnit из командной строки
- Флаги Perl -pe, -pi, -p, -w, -d, -i, -t?
- xcopy файл, переименовать, подавить сообщение «Does xxx указать имя файла ...»
Вы должны выдать все команды в одном вызове system()
:
system(paste("cd",getwd() "&& bgame -y 2010 2010bos.eva >2010bos.txt",sep=" "))
Вы уже должны быть в своем рабочем каталоге, поэтому я не уверен, что cd getwd()
необходим. И вам может понадобиться кавычки вокруг вашего пути, потому что они содержат пробелы. Ошибка может быть решена путем помещения пробелов вокруг >
.
Если бы я был на вашем месте, я бы попробовал это:
system("bgame -y 2010 2010bos.eva > 2010bos.txt")
ОБНОВИТЬ:
И вы должны, вероятно, прислушаться к этому совету в разделе «Различия между 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.
Никто, кроме того, не обнаружил, что 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) }
Прерывает ли ваш код код, когда вы получаете ошибку 1 или выполнение продолжается?
Всякий раз, когда выполнение команд системы на другом языке полезно распечатать системный вызов, прежде чем вы вызываете его, чтобы увидеть, что именно происходит, вытащите оболочку, которую вы собираетесь использовать, и проверьте ее на ту же ошибку. Поскольку команда выполняется правильно, это может быть hickup в bgame или R.
Если вы посмотрите на http://astrostatistics.psu.edu/datasets/R/html/base/html/shell.html, вы можете увидеть флаг переменной, переданный системному вызову. “Flag the switch для запуска команды под оболочкой Если shell bash или tcsh, значение по умолчанию изменяется на «-c». »
Также «используемая shell может быть изменена путем установки переменной конфигурации R_SHELL на подходящее значение (полный путь к оболочке, например / usr / local / bin / bash)».