R 检查编号是否在切割类型间隔或范围内

R 检查编号是否在切割类型间隔或范围内,r,R,我的目标是检查给定的数字是否在cut类型间隔或范围内,如:“[1.86e+03,2.43e+03]”。我得到的间隔是一个字符串。 由于某种原因,我在区间的高端遇到了问题,看不出我做错了什么,而区间的低端似乎工作正常,我还没有将其包含在下面的代码中 这里有一部分代码似乎不起作用: library(readr) IsNumLess <- function(num, interval) { intervalL <- unlist(strsplit(interval, ",")) #

我的目标是检查给定的数字是否在
cut
类型间隔或范围内,如:“[1.86e+03,2.43e+03]”。我得到的间隔是一个字符串。 由于某种原因,我在区间的高端遇到了问题,看不出我做错了什么,而区间的低端似乎工作正常,我还没有将其包含在下面的代码中

这里有一部分代码似乎不起作用:

library(readr)

IsNumLess <- function(num, interval) {

  intervalL <- unlist(strsplit(interval, ",")) #split on comma
  lastSt <- intervalL[2]      #get the whole second part
  lastNum <- parse_number(lastSt)  #get just the number, without ) or ]

if (endsWith(lastSt, ']')) #up to and including
  {
    if (!(num <= lastNum))
   {
    print(num)
    print(lastNum)
    print(num <= lastNum)  #this and line below should return the same value
    print(2430 <= 2430)
    print("f3")
    return(FALSE)
    }
  }
else # ) - up to but not including
  {
    if (!(num < lastNum))
    {
      print("f4")
      return(FALSE)
    }
  }
  return(TRUE)
}
编辑: 谢谢G5W,重复的问题链接让我找到了我需要的地方。。。。这一行在第二个“如果”中起作用:

if (!(num < lastNum | isTRUE(all.equal(num, lastNum))))
if(!(num
这是计算机中小数表示精度的问题。看

如果您运行:

sprintf("%.54f",num)  
sprintf("%.54f",lastNum)
您将看到
num!=lastNum


代码中的一个简单修复方法是替换
print(num Try,
2340==2.43e+03
这是舍入错误。另外,尝试
options(digits=20);2.43
它永远不会到达else,因为“…2.43e+03]”达到并包括…并在结尾返回TRUE。如果执行,则不会执行else部分。但是2.43e3>2430:-)将函数更改为接受一个公差(即
函数(num,interval,tolerance)
,然后将函数内的条件更改为
如果(!(abs(num-lastNum)<(tolerance))
,则它可以工作。(不要忘了也更改第二个条件)。使用
IsNumLess(2430,[1.86e+03,2.43e+03]”,0.00001)调用函数
我的目标是查看一个数字是否在范围内,打印语句只是为了调试…我想得到正确的答案。如果(!(numsprintf("%.54f",num) sprintf("%.54f",lastNum)