R 简单序列的逻辑返回不正确
下面是一些基本代码及其输出。对于包含1.2的序列,我只能说逻辑测试给出了不准确的结果。它适用于许多其他价值观R 简单序列的逻辑返回不正确,r,R,下面是一些基本代码及其输出。对于包含1.2的序列,我只能说逻辑测试给出了不准确的结果。它适用于许多其他价值观 # Incorrect > seq(0.5, 1.5, by=0.05) == 1.2 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # Correct &
# Incorrect
> seq(0.5, 1.5, by=0.05) == 1.2
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.15
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.25
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.3
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
我尝试使用以下方法测试所有值,但没有重现错误:
> sapply(seq(0.5, 1.5, by=0.05), function(x){sum(seq(0.5, 1.5, by=0.05) == x)})
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我使用的是R版本2.13.2(2011-09-30),平台:x86_64-pc-linux-gnu(64位)。您可以通过编写自己的比较函数来复制all.equal的功能:
is.nearenough=function(x,y,tol=.Machine$double.eps^0.5){
abs(x-y)<tol
}
is.nearenough=函数(x,y,tol=.Machine$double.eps^0.5){
abs(x-y)您可以通过编写自己的比较函数来复制all.equal所做的工作:
is.nearenough=function(x,y,tol=.Machine$double.eps^0.5){
abs(x-y)<tol
}
is.nearenough=函数(x,y,tol=.Machine$double.eps^0.5){
abs(x-y)这不是一个错误,这是使用浮点算术表示数字的结果。你应该使用all.equal
而不是==
来测试是否相等。这个问题已经被问了好几次了,所以-我将尝试找到它们并发布链接。这是我的猜测。但我假设对于o其他值,否?另外,all.equal
在这里不起作用,因为我想找到等于1.2的值(我在which()
中进行了此测试)。类似的问题:,它也在R-FAQ中。您可能想阅读整个文档。这应该会节省您一些时间(可能会让您感到尴尬)从长远来看,您可以使用Vectorize
创建all.equal
的矢量化版本,然后使用创建(all.equal.vec(…)==TRUE)
。这不是一个错误,这是使用浮点算术表示数字的结果。你应该使用all.equal
而不是=
来测试相等性。这个问题已经被问了好几次了,所以-我将尝试找到它们并发布链接。这是我的猜测。但我假设同样的问题也会发生se表示其他值,否?另外,all.equal
在这里不起作用,因为我想找到等于1.2的值(我在which()
中进行了此测试)。类似的问题:,也在R-FAQ中。您可能想阅读整个文档。这应该会节省您一些时间(可能会让您感到尴尬)从长远来看,您可以使用Vectorize
创建all.equal
的矢量化版本,然后使用创建(all.equal.vec(…)==TRUE)
。