当我打电话
library(Hmisc)
plot(...)
minor.tick(...)
偶尔我会遇到以下错误:
Error in seq.default(low.minor, hi.minor, by = distance.between.minor) :
'to' cannot be NA, NaN or infinite
In addition: Warning message:
In max(possible.minors[possible.minors <= range[2]]) :
no non-missing arguments to max; returning -Inf
其中minor.tick
有以下几行:
range <- par("usr")[if (w == "x") 1:2 else 3:4]
tick.pos <- if (w == "x") par("xaxp") else par("yaxp")
...
possible.minors <- tick.pos[2] + (0:100) * distance.between.minor
hi.minor <- max(possible.minors[possible.minors <= range[2]])
当我打印出来的价值观possible.minors
和range[2]
,我看到的,例如,
> possible.minors [1] 1.20 1.24 1.28 1.32 1.36 1.40 1.44 1.48 1.52 1.56 1.60 1.64 1.68 1.72 1.76 [16] 1.80 1.84 1.88 1.92 1.96 2.00 2.04 2.08 2.12 2.16 2.20 2.24 2.28 2.32 2.36 [31] 2.40 2.44 2.48 2.52 2.56 2.60 2.64 2.68 2.72 2.76 2.80 2.84 2.88 2.92 2.96 [46] 3.00 3.04 3.08 3.12 3.16 3.20 3.24 3.28 3.32 3.36 3.40 3.44 3.48 3.52 3.56 [61] 3.60 3.64 3.68 3.72 3.76 3.80 3.84 3.88 3.92 3.96 4.00 4.04 4.08 4.12 4.16 [76] 4.20 4.24 4.28 4.32 4.36 4.40 4.44 4.48 4.52 4.56 4.60 4.64 4.68 4.72 4.76 [91] 4.80 4.84 4.88 4.92 4.96 5.00 5.04 5.08 5.12 5.16 5.20
> range[2] [1] 1.2
最终给了我们
> possible.minors[1]
[1] 1.2
> range[2]
[1] 1.2
> possible.minors[1] <= range[2]
[1] FALSE
因此1.2不小于或等于1.2。好吧,很明显这里有些浮点废话。我该如何解决?
附录:
当我打印更多数字时,我发现
> print(possible.minors[1], digits=20)
[1] 1.2000000000000001776
> print(range[2], digits=20)
[1] 1.1999999999999999556
这个包的作者似乎预料到了这一点,因为下一行将检查结果是否为NA,如果是,则分配一个值。也许这在R的早期版本中有效,但现在看来会导致程序包崩溃。无论如何,我认为正确的方法是检查是否存在使不等式成立的任何值,如果是,则选择最大值,否则选择其他方法。现在,我可以在自己的机器上实施此更改,但是如何将其提供给世界各地的Hmisc用户?
我已将此问题发布在Hmisc github上。
我认为一种快速的解决方案是更改线路
if (is.na(low.minor))
和
if (is.na(hi.minor))
到
if (is.na(low.minor) || is.infinite(low.minor))
和
if (is.na(hi.minor) || is.infinite(hi.minor))
但是更好的解决方案是先检查是否
any(possible.minors >= range[1])
和
any(possible.minors <= range[2])
在进行任何索引之前,避免警告消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句