在R中显示具有闭合边界的间隔时出现问题
我正在使用在R中显示具有闭合边界的间隔时出现问题,r,set,digits,R,Set,Digits,我正在使用R中的set包尝试创建一个上限为1、下限非常接近1的闭合区间。问题是我在中场休息时有一些奇怪的行为。调用时,它显示为一个仅包含下限的单例集,但当我询问间隔中的最小值或最大值时,它会给出正确的值。当我看区间的结构时,它将两个边界显示为一个 library(sets) options(digits = 15) #Set lower bound and interval L <- 0.999999999989428 INT <- sets::interval(l = L, r
R
中的set
包尝试创建一个上限为1、下限非常接近1的闭合区间。问题是我在中场休息时有一些奇怪的行为。调用时,它显示为一个仅包含下限的单例集,但当我询问间隔中的最小值或最大值时,它会给出正确的值。当我看区间的结构时,它将两个边界显示为一个
library(sets)
options(digits = 15)
#Set lower bound and interval
L <- 0.999999999989428
INT <- sets::interval(l = L, r = 1, bounds = 'closed')
#Print interval and show details
INT
{0.999999999989428}
min(INT)
[1] 0.999999999989428
max(INT)
[1] 1
str(INT)
List of 1
$ :List of 4
..$ l : num 1
..$ r : num 1
..$ lc: logi TRUE
..$ rc: logi TRUE
- attr(*, "domain")= chr "R"
库(套)
选项(数字=15)
#设置下限和区间
L如果您阅读了str()
的帮助文章,您将看到要打印的默认小数位数(digits.d)是3。设置选项(数字=15)
不会更改str()
中的默认值。您只需更改函数args中的位数:
str(INT,digits.d=15)
List of 1
$ :List of 4
..$ l : num 0.999999999989428
..$ r : num 1
..$ lc: logi TRUE
..$ rc: logi TRUE
- attr(*, "domain")= chr "R"
编辑:
这需要一点挖掘。这个问题深藏在隐藏的代码中。您的间隔始终构造正确,但用于查看结构的打印机制在all.equal
函数中的公差限制为1.05719877298024e-11,您需要10^-15。这说明了问题:
##code thinks that 0.999999999989428 = 1 as the tolerance is to high
all.equal(L, 1)
[1] TRUE
##you are unable to set the tolerance to your required level
all.equal(L, 1,tolerance = 10^-15)
[1] "Mean relative difference: 1.05719877298024e-11"
为了解决这个问题,我修改了隐藏代码,使用逻辑运算符==
而不是all.equal()
。请参见此处,==
可以识别不同的值:
L==1
[1] FALSE
首先运行此行修改隐藏代码,然后根据需要打印间隔:
as.character.interval <-
function(x, ...)
{
if (length.interval(x) < 1L)
return("{}")
if (interval_is_uncountable(x)) {
bounds <- if (sets_options("openbounds") == "][")
c("]", "[", "[", "]")
else
c("(", "[", ")", "]")
## merge adjacent degenerate intervals into sets
.merge = function(x, y) {
i = length(x)
X <- x[[i]]
Y <- y[[1]]
if ((is.set(X) || isTRUE(X$l == X$r)) &&
isTRUE(all.equal(Y$l, Y$r))) {
if (!is.set(X)) X <- set(X$l)
c(x[-i], list(c(X, Y$l)))
} else
c(x, y)
}
l <- Reduce(.merge, lapply(unclass(x), list))
## format individual interval
.format <- function(x) {
if (is.set(x))
format(x)
else if (isTRUE(x$l == x$r))
paste("{", as.character(x$l), "}", sep = "")
else
paste(bounds[1 + x$lc], x$l, ", ", x$r,
bounds[3 + x$rc], sep = "")
}
paste(sapply(unclass(l), .format), collapse = " U ")
} else {
.format <- function(x)
if (x$l == x$r) x$l else paste(x$l, "..", x$r, sep = "")
paste(sapply(unclass(x), .format), collapse = ", ")
}
}
嗨,本,我解决了这个问题,请看下面我的编辑
INT
[0.999999999989428, 1]