2016-11-19 5 views
0

ここでは簡単なクラスの質問がありますが、私は困惑しています。 ここでは、私はifelseを使用することになっています。最初の数行は正常に機能しますが、私のxが論理的な場合、関数はTRUEを "White"という単語に、FALSEを "Black"という単語に変換する必要があります。私は実行するたびにRは自分のオブジェクトが論理的でないと主張するのはなぜですか?

q5 <- function (x) { 
    ifelse (is.numeric (x), 
     (div_three <- which (x %% 3 == 0)) & 
      (not_div_three <- which (x %% 3 != 0)) & 
      (x [div_three] <- (x [div_three]/3)) & 
      (x [not_div_three] <- (x [not_div_three] * 2)), 
      ifelse (is.character (x), 
        stop ("Input is a character."), 
        ifelse (is.logical (x), 
          (is_true <- which (x == "TRUE")) & 
          (is_false <- which (x == "FALSE")) & 
          (x [is_true] <- "WHITE") & 
          (x [is_false] <- "FALSE")))) 
    x 
} 

はしかし、q5 (c(TRUE, TRUE, FALSE, TRUE, TRUE))例えば、私はこのエラーを取得する:

Error in (is_true <- which(x == "TRUE")) & (is_false <- which(x == "FALSE")) & : 
    operations are possible only for numeric, logical or complex types 

このベクターは間違いなく論理的です。単語を挿入する前にそれを文字に変えてみましたが、新しい要素を使ってみましたが、すべて同じです。 IDは、私の要素が実際に論理的であることを考えれば、このメッセージが何を意味するのかを理解する助けが大好きです。 ありがとうございました!

+0

'を参照してください - ( "R" < x)が "R" と - あなたは、x <を実行してみることができます1& "WHITE") 'がそのエラーを投げると、今はifelseを放棄します。これはすでに読み込みとデバッグが難しいです。 – rawr

+0

残念ながら、これは' ifelse'を使って行われることになっています。もちろん、私はそれがなくても簡単にできるのですが... –

+1

'q5 < - Vectorize(function(x)ifelse(x)、ifelse(x %% 3 == 0、x * 2、x/ifelse(x、 'WHITE'、 'BLACK')、NA)))););););) q5(c(TRUE、TRUE、FALSE、TRUE、TRUE)) – rawr

答えて

3

is.logical(x)のコードをこれに置き換えてください。評価が "WHITE" & "FALSE"が発生していたため、Rで何かinside()が返されるため、エラーが発生しました。 ( ` "白" を返しますと` - ( "WHITE" [is_true] <をX)の違い

ifelse (is.logical (x), x <- ifelse(x, "WHITE", "FALSE")) 
+0

ありがとうございます!それがそれを解決しました。彼らは私たちに 'ifelse'をあまり使わせました。私はそれでもっとも単純な解決法を忘れてしまいました。 –

+0

外側の 'ifelse'は' if'でなければなりません。 'ifelse'の中で' <-'を使わないでください。 – Roland

+0

@Roland私はそれに同意します。私は< - inside ifelse()を使うのは決して好みません。 –

関連する問題