7

TRUE または FALSE を出力する R スクリプトがあります。Rでは、正真正銘のT/Fデータ型を使用していますが、その戻り値をbashにエコーすると、次のように文字列のように見えます:

"[1] TRUE"

また

"[1] FALSE"

どちらも [1] で始まります。どちらも [0] ではありません。これはタイプミスではありません。とにかく、この結果は、このRscriptの出力をテストして後続のスクリプトを実行しようとすると、「TRUE」または「 1" よりクリーンで優れた感触です。

A=$(Rscript ~/MyR.r)
echo $A
if [ "$A" == "[1] TRUE" ]; then
    bash SecondScript.sh
fi

Rに真のブール値を出力させるか、Bashが出力文字列を受け入れて比較のために0/1に変換するようにするにはどうすればよいですか? つまり、私はむしろテストしたい...

if [ $A == TRUE ];

よりも

if [ "$A" == "[1] TRUE" ];

それは可能ですか、それとも私はこれに満足すべきですか、どのように機能しますか?

*** アップデート ***

これを生成するRscriptの最小化バージョンは次のとおりです...

myinput <- TRUE #or FALSE

FunctionName <- function(test){
  if (test == TRUE){
    val <- TRUE
  } else {
    val <- FALSE
  }
  return(val)
}

FunctionName(myinput)
4

4 に答える 4

12

オブジェクト名が R インタープリターに提供されるときに発生する print() または暗黙的な print() を使用する代わりに、cat()TRUE または FALSE の前に "[1] " を追加しないものを使用する必要があります。0/1 が必要な場合は、 を使用しますcat(as.numeric(.))。代わりにこれを試してください:

myinput <- TRUE #or FALSE
FunctionName <- function(test){
   if (test == TRUE){
              val <- TRUE
                    } else {
              val <- FALSE
            }
   cat(as.numeric(val))
}
FunctionName(myinput)

さらに処理するためにその値が必要な場合は、これを使用することもできます。

cat(as.numeric(val)); invisible(val)
于 2012-05-13T20:46:14.083 に答える
1

R 出力を TRUE/FALSE に変換する関数を bash で定義することもできます。

r_to_bash() {
  echo "$1" | cut -d' ' -f2
}

これで、次のように使用できます。

A=$(r_to_bash "$A")
if [ $A == TRUE ];
于 2012-05-13T21:32:11.033 に答える
1

スクリプトの最後の行を次のように変更することもできます。

write( FunctionName( myinput ), stdout())

TRUEこれにより、[1] なしでだけが印刷されます。

于 2018-07-24T19:36:42.490 に答える
0

R スクリプトの動作を変更する以外に、Bash 側で次のいずれかを実行できます。

if [[ $A == *TRUE* ]]

また

if [[ $A =~ TRUE ]]

正規表現マッチングを使用する 2 番目のケースでは、通常、パターンを変数に入れることをお勧めします。

pattern=TRUE
if [[ $A =~ $pattern ]]

しかし、このような明らかに単純なケースでは必要ありません。

于 2012-05-13T21:23:34.290 に答える