2016-11-19 124 views
0

我在這裏有一個簡單的課堂問題,我很難過。 在這一個,我只應該使用ifelse。前幾行工作正常,但如果我的x是合乎邏輯的,則該函數應將任何TRUE轉換爲單詞「白色」,並將任何FALSE轉換爲單詞「黑色」。爲什麼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 

這個載體是絕對合理的。在插入單詞之前,我嘗試將它轉換成字符,並嘗試使用新元素,但它們都是一樣的。 如果說我的元素其實是合乎邏輯的,那麼我很想知道這個信息的含義。 謝謝!

+0

'(X [is_true] < - 「白」)'將返回 「白色」 和'( 1&「WHITE」)'會拋出錯誤,我現在放棄ifelse,這已經很難讀取和調試 – rawr

+0

不幸的是,這應該使用'ifelse'來完成。當然,我可以輕鬆地做到這一點,但沒有它,但... –

+1

'q5 < - Vectorize(函數(x)ifelse(is.numeric(x),ifelse(x %% 3 == 0,x * 2,x/3),ifelse(is.character(x),stop('chr'),ifelse(is.logical(x),ifelse(x,'WHITE','BLACK'),NA)))); q5(c(TRUE,TRUE,FALSE,TRUE,TRUE))' – rawr

回答

3

用此替換is.logical(x)的代碼。錯誤是因爲在評估「WHITE」&「FALSE」發生,因爲在R中,返回任何內部()。你可以試着運行X < - 「R」 和(x < - 「R」)看出差別

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

非常感謝!這解決了它。他們讓我們非常使用'ifelse',我忘記了最簡單的解決方案。 –

+0

外'ifelse'應該是'if'。不要在'ifelse'中使用'<-'。 – Roland

+0

@羅蘭我同意這一點。我從不喜歡使用< - 自己內部的ifelse()。 –

相關問題