2016-11-19 1 views
0

Ich habe hier eine einfache Klassenfrage, und ich bin ratlos. In diesem, wo ich nur ifelse verwenden soll. Die ersten paar Zeilen funktionieren gut, aber wenn die meine x ist logisch, sollte die Funktion alle TRUE in das Wort "White", und alle FALSE in das Wort "Black".Warum behauptet R mein Objekt ist nicht logisch?

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 
} 

Jedes Mal, wenn ich q5 (c(TRUE, TRUE, FALSE, TRUE, TRUE)) zum Beispiel laufen, bekomme ich diesen Fehler:

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

Dieser Vektor definitiv logisch ist. Ich habe versucht, es in Zeichen zu verwandeln, bevor ich die Wörter eingefügt habe, und habe auch versucht, ein neues Element zu verwenden, aber es ist alles gleich. Ich liebe etwas Hilfe herausfinden, was diese Nachricht bedeutet, da mein Element in der Tat logisch ist. Vielen Dank!

+0

'zu sehen (x [is_true] <- "WHITE")' zurückkehren wird "weiß" und '(1 & "WHITE") 'wird diesen Fehler werfen, ich würde ifelse jetzt aufgeben, das ist schon schwer zu lesen und zu debuggen – rawr

+0

Leider soll dies mit' ifelse' gemacht werden. Natürlich könnte ich es ohne es leicht machen, aber ... –

+1

'q5 <- Vectorize (Funktion (x) ifelse (is.numeric (x), ifelse (x %% 3 == 0, x * 2, x/3), ifelse (is.character (x), stop ('chr'), ifelse (is.logisch (x), ifelse (x, 'WEISS', 'SCHWARZ'), NA)))); q5 (c (WAHR, WAHR, FALSCH, WAHR, WAHR)) ' – rawr

Antwort

3

Ersetzen Sie Ihren Code für is.logical (x) mit diesem. Fehler war, weil in der Auswertung "WHITE" & "FALSE" aufgetreten ist, weil in R alles innerhalb() zurückgegeben wird. Sie können versuchen, x Lauf < - "R" und (x < - "R"), um die Differenz

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

Vielen Dank !! Das hat es gelöst. Sie ließen uns 'ifelse' so sehr verwenden, dass ich die einfachsten Lösungen damit vergessen habe. –

+0

Die äußere 'ifelse' sollte ein' if' sein. Verwenden Sie nicht '<-' innerhalb' ifelse'. – Roland

+0

@Roland ich stimme dem zu. ich bevorzuge es nie, <- inside ifelse() selbst zu benutzen. –

Verwandte Themen