在 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"))
})
CRAN 上有一个 iterators 包,这可能就是您正在寻找的。然而,虽然它有一个“计数迭代器”
icount()
,但没有明显的方法让它从 0 以外的任何地方开始......你可以通过扰乱内部环境来破解它,但最好构建你自己的范围迭代器(基本上是自己再次滚动)。
另一件事要注意的是,用
:
构造的序列已经存储为 ALTREP(“替代表示”)对象,因此它们比您想象的要小得多:
vec <- 1:1e10
lobstr::obj_size(vec)
680 B
(但是,如果您尝试打印此对象,它将打印第一个
getOption("max.print")
元素 - 它不会拒绝评估自身...)