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)