R 中的惰性范围类

问题描述 投票:0回答:1

在 R 中,范围立即被评估为向量:

> 1:3
[1] 1 2 3

是否有一种惯用的方法来构建范围而不将它们评估为列表,或者我必须自己定义它?

setClass(
  "Range",
  representation(
    start = "numeric",
    stop = "numeric"
  )
)

Range <- function(start, stop) {
  new("Range", start = start, stop = stop)
}

setMethod("show", "Range", function(object) {
  cat(paste0(object@start, ":", object@stop, "\n"))
})
r range lazy-evaluation
1个回答
0
投票

CRAN 上有一个 iterators 包,这可能就是您正在寻找的。然而,虽然它有一个“计数迭代器”

icount()
,但没有明显的方法让它从 0 以外的任何地方开始......你可以通过扰乱内部环境来破解它,但最好构建你自己的范围迭代器(基本上是自己再次滚动)。

另一件事要注意的是,用

:
构造的序列已经存储为 ALTREP(“替代表示”)对象,因此它们比您想象的要小得多:

vec <- 1:1e10
lobstr::obj_size(vec)
680 B

(但是,如果您尝试打印此对象,它将打印第一个

getOption("max.print")
元素 - 它不会拒绝评估自身...)

© www.soinside.com 2019 - 2024. All rights reserved.