如何创建一个返回 2 个整数之和的函数?

How to Create a function that will return the sum of 2 integers?

提问人:ronzenith 提问时间:7/27/2019 最后编辑:NelsonGonronzenith 更新时间:7/27/2019 访问量:2637

问:

我遇到了一个简单的问题,但无法编写代码。如果你能帮助我,不胜感激。

问题:创建一个函数,该函数将返回 2 个整数的总和。

我的代码:

q1 <- function(a, b) {
  if (a == as.integer(a)) {
    if (b == as.integer(b)) {
      result1 <- a + b
    }
  }
} else {
  result1 <- NA
  result1
}

q1(3,6) - 假设它返回 9

q1(3.1,6) - 假设它返回 NA

顺便说一句,为什么我不能用这种方式写语法?if(is.integer(a) = TRUE){

r if 语句 整数

评论

0赞 ronzenith 7/27/2019
谢谢。为什么is.numeric优于as.integer?该问题要求 a 和 b 是整数。
1赞 utubun 7/27/2019
您是否需要您的函数仅将 s 作为 R 对象求和,或者您的函数应该只求和整数,即数?integer

答:

0赞 user123 7/27/2019 #1

您放错了一些括号,并且没有返回任何内容,请检查以下内容:

q1 <- function(a,b){
if (a == as.integer(a)){
    if (b == as.integer(b)){
      result1 <- a + b
    }
  }
 else {
  result1 <- NA
 }
  return(result1);
}
0赞 fabla 7/27/2019 #2

如果你希望你的函数只整数,就像在对象中一样。sum()R

Intsum <- function(a,b){
    if(is.integer(a) & is.integer(b) == TRUE){
      return(sum(a,b))
  }
  else {
     return(NA)
  }
}
1赞 Rui Barradas 7/27/2019 #3

在这个答案中使用了一个函数 (),略有编辑。它检查某个值是否与现在推荐的 .testIntegerTRUEisTRUE()

testInteger <- function(x){
  test <- all.equal(x, as.integer(x), check.attributes = FALSE)
  isTRUE(test)
}

q1 <- function(a, b) {
  if (testInteger(a) && testInteger(b)) {
    a + b
  } else {
    NA
  }
}

q1(3, 6)    # returns 9
q1(3.1, 6)  # returns NA
1赞 utubun 7/27/2019 #4

取决于您决定的整数。通常你不需要将整数存储为类的对象integer

整数向量的存在使数据可以传递给期望它们的 C 或 Fortran 代码,并且(小)整数数据可以准确而紧凑地表示。

所以,是整数,在 R 中表示为(尝试看到它)。所以我认为,我们不需要检查传递给函数的值的类,而是检查这些数字是否是具有一定容差整数3numericclass(3)

sum_int <- function(..., tol = .Machine$double.eps^.5){

  if(any(abs(round(c(...)) - c(...)) > tol)){
    return(NA)
  }

  return(sum(round(c(...))))
}

sum_int(1, 2, 3 + 1e-7)
#NA
sum_int(1, 2, 3 + 1e-15)
#6
sum_int(1, 2, 3 + 1e-15, tol = 0)
#NA
sum_int(1, 2, 3.1, tol = .02)
#NA
sum_int(1, 2, 3.1, tol = .2)
#6

在第一步中,我们获取传递给 .为了确定这些值是否为整数,我们使用定义或由用户容差级别定义的值(其定义方式与示例中所示相同)。之后,我们将数值四舍五入,使它们成为整数,并找到这些值的小数部分,作为参数的整个部分和参数本身之间的绝对差。如果任何分数超过公差水平 - 我们返回 NA。否则,我们将返回这些值的整个部分的总和。sum_int()tol?is.integer