如何在自定义函数中包括逻辑检查

时间:2019-01-09 19:01:19

标签: r function if-statement

我编写了一个自定义函数,该函数对一列数据执行数学转换,输入为数据,另一个为输入(温度)。我想进行2种不同的逻辑检查。第一个是该列中的任何值是否超过某个阈值,因为在阈值之上和之下的转换都不同。第二步是检查温度输入是否高于某个特定值,在这种情况下,发出警告,指出高于阈值的值不正常并检查数据。

现在,我已经用一系列if / else语句编写了函数。但是,这警告它仅使用T / F语句字符串的第一个元素。我的函数的简化示例如下:

myfun = function(temp,data) {
    if(temp > 34){
    warning('Temperature higher than expected')
  }
    if (data > 50) {
      result = temp*data
      return(result)
    } else if(data <= 50) {
      result = temp/data
      return(result)
    }
  }

myfun(temp = c(25,45,23,19,10), data = c(30,40,NA,50,10))
如您所见,由于仅在if / else语句中使用第一个值,因此它无法正确计算返回值,因为它不会在转换的两个版本之间进行切换。此外,它仅检查第一个温度值是否高于阈值。我如何才能将其正确地应用于每个值而不只是第一个值的逻辑检查?

-根据@The_Questioner的建议简化了功能,并将<50更改为<= 50。

1 个答案:

答案 0 :(得分:2)

代码的主要问题是将所有值作为向量传递给函数,但随后进行单个元素比较。您需要将元素一一传递给函数,或者将某种矢量化比较或for循环放入函数中。下面是 for循环方法,这可能是执行此操作的最简单的方法,但至少很容易理解发生了什么。

另一个问题是,在传递给任何条件语句之前,显然需要在 data 向量中处理NA。否则会出现错误。

最后一个问题是数据 = 50时的处理方式。现在,您有条件测试的条件是大于或小于50,但是您可以看到,数据中的第4点< / strong>是50,所以现在您得到NA。

myfun = function(temp,data) {
    result <- rep(NA,length(temp))
    for (t in 1:length(temp)) {
        if(temp[t] > 34) {
            warning('Temperature higher than expected')
            if (!is.na(data[t])) {
                if (data [t] > 50) {
                    result[t] <- temp[t]*data[t]
                } else if(data[t] < 50) {
                    result[t] <- temp[t]/data[t]

                }
            }
        } else {
            if (!is.na(data[t])) {
                if (data[t] > 50) {
                    result[t] <- temp[t]*data[t]

                } else if(data[t] < 50) {
                    result[t] <- temp[t]/data[t]

                }
            }
        }
    }
    return(result)
}

输出:

> myfun(temp = c(25,45,23,19,10), data = c(30,40,NA,50,10))
[1] 0.8333333 1.1250000        NA        NA 1.0000000