编写一个接受整数向量并返回逻辑向量的函数

时间:2019-02-07 14:17:55

标签: r

我偶然发现了一个我要解决的问题。

“编写一个函数,该函数接受整数向量,并在输入为偶数时返回逻辑向量TRUE,在输入为奇数时返回FALSE,在输入为非限定时返回NA(即Inf,-Inf ,NA,NaN)。请检查它是否可用于正,负,零和无限输入。”

f <- function(x,y)
{
  if (x==Inf)
  {
    print ("NA")
  }else 
    if(x%%2=0)
{print ("TRUE")
    }else
        {print("FALSE")}
  if (y==Inf)
    {print("NA")
    }
  else
    if (y%%2==0)
  {print ("TRUE")
  } else
  {print ("FALSE")
  }
  print(c(x+y, x-y, x^4-y^3, x^2+y^2, y*x))
}

通过我的眼睛,我看不到哪里出了问题。我收到错误代码,提示“错误:“}”中的“}””

任何指导将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以稍微缩短功能并编写

f <- function(x) { x %% 2 == 0 }

测试

f(c(1:6, Inf, -Inf, NA, NaN))
# [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE    NA    NA    NA    NA

答案 1 :(得分:1)

当前方法的问题是您试图对向量进行操作,但是if-else逻辑实际上是要对标量(即单个值)进行操作。我建议使用矢量化解决方案,例如ifelse()函数。我们可以将对ifelse的调用链接在一起,但在这里使用case_when包中的dplyr可能会更容易:

library(dplyr)

f <- function(x) {
    result <- case_when(
        x %% 2 == 0 ~ TRUE,
        x %% 2 == 1 ~ FALSE,
        is.infinite(x) ~ NA,
        is.nan(x) ~ NA,
        TRUE ~ NA
    )

    return(result)
}

编辑:

我更喜欢@markus的答案,这可能正是您的老师所期望的。但是如上所述,使用case_when可以使您期望的映射变得明确。因此,从代码清晰的角度来看,这是完全清楚的。