Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中显示具有闭合边界的间隔时出现问题_R_Set_Digits - Fatal编程技术网

在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]