R语言中惰性Range类:有无惯用方法构造非即时求值范围?
关于R语言中延迟求值范围的实现问题
在R语言中,:运算符生成的范围会被即时求值为向量,示例如下:
> 1:3 [1] 1 2 3
请问有没有符合R语言惯用风格的方法,能构造不会被即时求值为向量的范围?还是必须像下面这样自行定义范围类?
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基础语法里没有原生支持这种“未求值范围”的结构——:运算符的设计目标就是直接生成序列向量,不存在延迟求值的原生实现。
如果要保存起始/终止值、不即时展开成向量的范围,自定义S4类是完全符合R惯用风格的方案。你写的这段代码就很规范:通过setClass定义存储起始和终止数值的类,用Range函数作为构造器创建实例,再通过setMethod自定义显示逻辑,让实例输出类似start:stop的格式,这种实现方式在R的面向对象编程场景中很常见。
当然也可以用普通列表简单存储(比如list(start = 1, stop = 3)),但这种方式没有类型约束,也无法自定义实例的行为(比如特定的显示格式、序列生成方法等),相比之下自定义类的方案更严谨,也更便于后续扩展功能。
内容的提问来源于stack exchange,提问作者Jake Ireland
相关产品推荐
相关产品推荐

