Не удалось получить результат команды R language system2

Я не могу получить результат system2. попытался выполнить пример файла jar.

execute_system.R:

workingDir <- "C:/Code"
setwd(workingDir)
command <- "java -jar sample.jar 674"
commandResult <- system2(command, stdout="C:/Code/stdout.txt", stderr="C:/Code/stderr.txt")
cat("commandResult: ", commandResult)

Я получаю сообщение об ошибке при выполнении этого execute_system.R файл и пустой файл генерируется (stdout.txt, stderr.txt)

commandResult: 127
warning message: running command '"java -jar sample.jar 674"' had status 127

Я хочу прочитать результат команды system2 и должен обрабатывать данные результата.

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

C:/Code>java -jar sample.jar 123
convert from String to int...
Input: 123
Value: 123
Conversion process done!!!

фактический мой Java-код

public class Conversion{
   public static void main(String args[]){
      System.out.println("convert from String to int...");
      String input = args[0];
      System.out.println("Input: " + input );
      int value = Integer.valueOf(input)
      System.out.println("Value: " + value);
      System.out.println("Conversion process done!!!);
   }
}

я преобразовал эту программу java в исполняемый файл jar (образец.сосуд.)

пожалуйста, помогите мне. Спасибо заранее.

2 ответов


используя ваш код, он работал для меня без ошибки, когда я сделал следующее:

system2('java', args = c('-jar', 'sample.jar', '123'),
         stdout = 'stdout.txt', stderr = 'stderr.txt')

я запустил это на Mac OSX 10.10.5 (Yosemite). Результаты были напечатаны в " stdout.формат txt."

кажется, из документации system2, первый вариант-это просто команда (т. е. без аргументов). Аргументы должны быть указаны с помощью :

подробности

В отличие от системы, команда всегда цитируется shQuote, поэтому она должна быть одной командой без аргументов.

...


это простая ошибка.

во-первых, давайте определим некоторые термины:

  • сообщении это фрагмент кода оболочки, который обычно представляет собой одно действие для выполнения оболочки. Действие может быть задокументированной оболочкой builtin или ключевым словом command plus arguments, имя файла внешнего исполняемого файла plus arguments, составная команда (например, связанный блок или подрешетка), конвейер всего вышеперечисленного, или список команд из всего вышеперечисленного. Несколько операторов обычно могут быть закодированы последовательно с помощью разделителей операторов, которые отличаются оболочкой. Например, Unix bash shell использует точки с запятой (для выполнения переднего плана) или амперсанды (для фона), в то время как Windows cmd shell использует амперсанды (для переднего плана).
  • команда это очень общий термин, который может относиться к любому из вышеперечисленных типов команд, или целого заявлении, или даже для нескольких последовательных операторов. Это такой термин, который требует контекста, чтобы прояснить его значение.
  • простой командой это команда, которая выполняет только оболочку встроенного или внешнего исполняемого файла. Они могут возникать как собственные операторы или как часть составных команд, конвейеров или списков команд. В оболочке bash назначения переменных и перенаправления могут составлять часть или даже всю простую оболочку команда.
  • слово в контексте одного простой командой, это имя программы, которую вы хотите запустить. Это будет либо задокументированное имя встроенной оболочки, либо имя файла внешнего исполняемого файла. Это иногда описывается как первое слово команды, или аргумент нулевой.
  • доводы в контексте одного простой командой, это нулевые или более (дополнительные) аргументы, заданные для встроенного или исполняемого файла.
  • командная строка этот термин несет с собой предположение, что он относится к один строка шелл-код. Однако он часто используется несколько более свободно, чтобы описать любой автономный, часто одноразовый фрагмент кода оболочки, который может на самом деле содержат разрывы строк и, таким образом, технически состоят из более чем одной текстовой строки. Термин команда иногда используется как стенография для этой концепции, что еще больше добавляет к ее двусмысленности. Также обратите внимание, что командная строка иногда используется как стенография для интерфейс командной строки тип пользовательского интерфейса, который не подразумевает неограниченный срок команда.
  • командная система это еще один общий термин, который требует контекста, чтобы прояснить его значение. Это можно считать синонимом команда, за исключением дополнительного модификатора "система" предполагает, что выполнение команды инициируется из программного контекста, который существует вне оболочки, например R сессия.

конструкция system2() функция, похоже, предполагает, что авторы намеревались использовать ее только для запуска простые команды. Он принимает слово в качестве первого аргумента функции (ожидается скалярная строка, означающая одноэлементный символьный вектор) и аргументы командной строки как второй (также ожидается, будет символьный вектор, ноль или более элементов). Вот как документация помещает его в описание этих двух аргументов функции:

command

системная команда, вызываемая в виде символьной строки.

args

символьный вектор аргументов в command.

вышеуказанное не делает его совершенно ясным, но первое предложение раздела деталей помогает:

в отличие от system(), command всегда цитирует shQuote(), поэтому это должна быть одна команда без аргументов.

как вы можете видеть, документация немного расплывчата в том, что она разбрасывает общий термин команда без особых разъяснений. Они также используют неопределенный термин командная система, что тоже не очень помогает. Они имеют в виду, что первый аргумент функции command предназначен для слово of a простой командой. Если вы хотите пройти любой аргументы командной строки, вы должны указать их во втором аргументе функции args.

в защите авторов код оболочки может быть очень зависимым от платформы и непоследовательным в реализации и поведении. Чтобы использовать более точные термины, которые я определил в этом post поставила бы авторов документации под угрозу совершения ошибок, по крайней мере, в отношении некоторых систем, которые R стремится поддерживать. Неопределенность может быть убежищем от риска прямой ошибки.

обратите внимание, что это отличается от другой функции R system command,system():

command

системная команда, вызываемая в виде символьной строки.

и в деталях раздел:

command обрабатывается как команда плюс аргументы, разделенные пробелами. Поэтому, если путь к команде (или один аргумент, такой как путь к файлу) содержит пробелы, он должен быть процитирован, например,shQuote(). Unix-alikes передает командную строку в оболочку (обычно'/bin/sh’, и POSIX требует этой оболочки), поэтому command может быть все, что оболочка считает исполняемым, включая скрипты оболочки, и может содержать несколько команд, разделенных ;.

и system() первый аргумент функции command полное командная строка.

поэтому они фактически используют точно такое же имя аргумента функции (command) и описание ("системная команда, которую нужно вызвать, в виде символьной строки."), хотя аргумент имеет два совершенно разных значения между system() и system2()! Понимание этой документации действительно требует тщательного анализа читатель.


так, Наконец, мы можем понять, как правильно использовать system2() чтобы вызвать нужную команду java:

word <- 'java';
args <- c('-jar','sample.jar','674');
result <- system2(word,args,stdout='C:/Code/stdout.txt',stderr='C:/Code/stderr.txt');

просто чтобы попытаться уточнить дальше, полезно поэкспериментировать с поведением этих функций, попробовав несколько простых тестовых случаев. Например (на моем Cygwin bash shell):

system('printf %d:%x\\n 31 31');
## 31:1f
system2('printf',c('%d:%x\\n','31','31'));
## 31:1f

(обратите внимание, что учетверение обратных косых черт необходимо, поскольку они проходят через 3 контекста интерполяции, а именно (1) R интерполяция строкового литерала, (2) лексический контекст bash (без одинарных кавычек) и (3)printf интерполяция командой своего первого аргумента команды. Нам нужно printf для интерполяции финала \n код символа ASCII.)

кроме того, следует отметить, что, хотя system2() явно поощряет только бег простые команды путем принудительного разделения слово и доводы в отдельные аргументы функции очень возможно подорвать это намерение и использовать метасимволы оболочки для выполнения некоторого явно не простого кода оболочки через system2() интерфейс:

system('echo a b; echo c d');
## a b
## c d
system2('echo',c('a','b; echo c d'));
## a b
## c d

это, конечно, крайне нецелесообразно.