2016-06-16 42 views
7

私はsystem2の結果を得ることができません。サンプルjarファイルを実行しようとしました。R言語のsystem2コマンドの結果を取得できません

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!!!); 
    } 
} 

私は、実行可能jarファイル(sample.jarを)には、このJavaプログラムを変換します。

私を助けてください。 ありがとうございます。私は次のことをやったとき、あなたのコードを使用して

答えて

4

は、それがエラーなしで私の仕事:

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

私は、Mac OSX 10.10.5(ヨセミテ)でこれを実行しました。結果は "stdout.txt"に出力されました。

system2のドキュメントのように、最初のオプションは単なるコマンド(つまり引数なし)です。引数はargsパラメータで指定します。ここで

詳細セクションからの抜粋です:

詳細

システムとは異なり、コマンドは常にshQuoteで引用されているので、引数なしで単一のコマンドでなければなりません。

...

+0

こんにちはsteveb、そのうまく動作します。あなたの貴重なサポートに感謝します。 – Jack

9

これは作るための簡単な間違いです。

まずは、いくつかの用語を定義してみましょう:

  • 声明      これは、一般的に実行するシェルのための単一のアクションを表しシェルコードの一部です。アクションは、文書化されたシェル組み込みコマンドまたはキーワードコマンドプラス引数、外部実行ファイルのファイル名、引数、複合コマンド(ブレースされたブロックまたはサブシェルなど)、上のすべてのパイプライン、またはコマンドリスト上記のすべて。複数のステートメントは通常、シェルごとに異なるステートメントセパレーターを使用して順次コーディングできます。例えば、Unix bashシェルは、セミコロン(前景実行の場合)またはアンパサンド(バックグラウンドの場合)を使用し、Windows cmdシェルはアンパサンド(前景の場合)を使用します。
  • コマンド      これはコマンドの上記のタイプのいずれかに、または文全体に、あるいは複数の連続文を参照することができる非常に一般的な用語です。これは、その意味を明確にするために文脈を必要とする種類の用語です。
  • 単純なコマンド      これは組み込みシェルまたは外部の実行ファイルを実行するコマンドです。これらは、独自のステートメントとして出現することもあれば、複合コマンド、パイプライン、またはコマンドリストの一部を形成することもあります。 bashシェルでは、変数の代入とリダイレクトは単純なコマンドの一部または全体を構成することができます。
  • コマンドワード      単一シンプルなコマンドの文脈では、これはあなたが実行したいプログラムの名前です。これは、シェル組み込み関数の文書化された名前か、外部実行可能ファイルのファイル名になります。これは時々コマンドの最初の単語、又はゼロ番目の引数として記載されています。単一単純なコマンドの文脈において
  • コマンド引数      、これは組み込みまたは実行に与えられたゼロ個以上の(追加の)引数です。
  • コマンドライン      この用語は、それにそれがシェルコードの一行を指すという示唆を支持しています。しかし、実際には改行が含まれている可能性があり、技術的には複数のテキスト行で構成されている自己完結型の、しばしば一回限りのシェルコードを記述するために、少しゆるやかに使用されます。用語コマンドは時々、さらにそのあいまいさへの追加だけでなく、この概念の省略形として使用されています。またコマンドラインは時々、制限のない用語コマンドによって暗示されることはないユーザインタフェースのcommand-line interfaceタイプの省略形として使用されることに留意されたいです。
  • システムコマンド      これは、その意味を明確にするためのコンテキストを必要とする別の一般的な用語です。追加の修飾語「システム」は、コマンドの実行は、Rセッションとして、シェルの外部に存在するプログラムのコンテキストから開始されていることを示唆している以外は、それは、コマンドの同義語と見なすことができます。

system2()機能の設計は、著者が唯一簡単なコマンドを実行するために使用されることを意図したことを示唆しているようです。それは、(また、文字ベクトルであることが予想秒としてを(1要素の文字ベクトルを意味し、スカラー文字列であると予想)最初の関数の引数としてコマンドワードを取り、コマンド引数ゼロ個以上の要素)。ここではドキュメントは、これら2つの関数の引数の説明でそれを置く方法は次のとおりです。

command

       システムコマンドは、文字列として、呼び出されます。

args

        commandへの引数の文字ベクトル。上記

それは完全に明確にしていませんが、詳細セクションの最初の文には役立ちます:

system()とは異なり、commandは常にshQuote()で引用されているので、それはせずに、単一のコマンドでなければなりません議論

あなたが見ることができるように、それは非常に明確にすることなく、一般的な用語コマンド周りをスローすることで、ドキュメントは少しあいまいです。彼らはまた、あいまいな言葉システムコマンドを使用しています。彼らは何を意味することは最初の関数の引数commandコマンドワード簡単なコマンドのであることを意図しているということです。 コマンド引数を渡す場合は、2番目の関数引数argsに指定する必要があります。

著者の防衛では、シェルコードは非常にプラットフォームに依存し、実装と動作に一貫性がありません。私がこの記事で定義したより正確な用語を使うと、少なくともRがサポートしようとしているいくつかのシステムに関しては、ドキュメンテーション作成者はエラーを犯す危険があります。あいまいさは、間違いの危険性に対するセーフハウスです。これは他のRシステムのコマンド機能と異なること

注、system()

command

       システムコマンドは、文字列として、呼び出されます。

そして詳細セクションに:

commandをスペースで区切ったコマンドに加えて、引数として解析されます。したがって、コマンドへのパス(またはファイルパスなどの単一の引数)にスペースが含まれている場合は、引用符で囲む必要があります。 〜によってshQuote()。 Unix-alikesはコマンドラインをシェルに渡します(通常は '/bin/sh'、POSIXはそのシェルが必要です)。commandは、シェルスクリプトを含め、シェルが実行可能ファイルとみなすもので、複数のコマンドを;で区切って指定することができます。

のでsystem()のために、最初の関数の引数commandはフルコマンドラインです。

そこで彼らは実際に(「文字列として、システムコマンドが呼び出される。」)とまったく同じ関数の引数名(command)と説明を使用し、引数がsystem()system2()の間に2つの完全に異なる意味を持っているにもかかわらず!このドキュメントを理解するには、読者が注意深く解析する必要があります。


ので、最終的には、我々は正確に必要なjavaコマンドを呼び出すためにsystem2()を使用する方法を理解することができます

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

だけでさらに明確にしようと、それは行動を実験すると便利ですいくつかの簡単なテストケースを試すことによって、これらの機能の例えば、(私のCygwinのbashシェル上):

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

は(彼らは3つの補間コンテキスト、すなわち、(1)R文字列リテラル補間、(2)バッシュ(非通過するので、バックスラッシュが4倍が必要であることに注意してください(3)printfコマンドの最初のコマンド引数の補間。\nのASCII文字コードを表示するには、printfが必要です。)

また、system2()が明らかにのみ別の関数の引数にコマンド引数コマンドワードの分離を強制することによって簡単なコマンドを実行奨励するが、そうであることに留意すべきですその意図を覆し、シェルメタキャラクタを使用して、インターフェイスを介して、明らかに単純でないシェルコードを実行することは非常に可能です:

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

これはもちろん、お勧めできません。

関連する問題