简单序列的逻辑返回不正确

时间:2011-10-15 14:56:07

标签: 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
> 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位)。

1 个答案:

答案 0 :(得分:4)

您可以通过编写自己的比较函数来复制all.equal所做的事情:

is.nearenough=function(x,y,tol=.Machine$double.eps^0.5){
  abs(x-y)<tol
}

然后你可以做哪个(is.nearenough(s,1.2))其中s是你的序列。您可能需要调整应用程序的容差。