【问题标题】:Writing a function that accepts a vector of integers and returns a logical vector编写一个接受整数向量并返回逻辑向量的函数
【发布时间】:2019-02-07 14:17:54
【问题描述】:

我偶然发现了一个我正在努力解决的问题。

"编写一个函数,它接受一个整数向量并返回一个逻辑向量,当输入为偶数时为 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))
}

通过我的眼睛,我看不出我哪里出错了。我收到一个错误代码说“错误:“}”中的意外'}'

任何指导将不胜感激。

【问题讨论】:

  • 不确定代码,但错误很可能是由于括号放置错误 ({})。

标签: r


【解决方案1】:

你可以稍微缩短你的函数并写

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

【讨论】:

  • 令人惊叹,完美运行。比我走的路线简单得多,非常适合编程哈哈。谢谢
【解决方案2】:

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

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 会使您期望的映射变得明确。所以,从代码清晰的角度来看,发生了什么是完全清楚的。

【讨论】:

  • 感谢您的回复!但是我尝试了这段代码,它给了我“错误:“}”中的意外'}'
  • @AbbyFrancome 我的回答有误,请再试一次。
猜你喜欢
  • 2018-09-19
  • 2017-03-13
  • 2019-10-09
  • 2020-08-05
  • 1970-01-01
  • 2021-03-23
  • 2017-01-11
  • 2021-12-28
  • 2012-08-31
相关资源
最近更新 更多