2016-11-19 28 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()。 –

相关问题