R语言gmp包的[<-赋值操作是否忽略索引顺序?
R gmp包bigz对象逆序索引赋值行为异常问题
问题现象
使用R语言gmp包的bigz大整数类型时,索引赋值表现与R原生向量存在差异,对比测试代码如下:
# 原生整数向量测试 foo <- 1:5 foo2 <- c(10,20) foo[3:2] <- foo2 foo # 输出:[1] 1 20 10 4 5 # bigz对象测试 bar <- as.bigz(1:5) bar2 <- as.bigz(c(10,20)) bar[3:2] <- bar2 bar # 输出:Big Integer ('bigz') object of length 5: # [1] 1 10 20 4 5
对原生整数向量foo按逆序索引3:2赋值时,结果严格匹配索引顺序:第2位赋值为20,第3位赋值为10;但对bigz类型对象bar执行完全相同的操作时,第2位为10、第3位为20,未遵循指定的索引顺序。
测试环境信息:
- gmp包版本:0.6.5
- 运行环境:Windows平台 R 4.2.0
结论
这是gmp包本身的实现bug,不是对bigz对象索引规则的理解偏差。
R原生向量的索引赋值规则为传入的值与索引位置严格按顺序一一映射:执行x[idx] <- val时,无论idx是逆序、乱序还是存在重复值,都会将val的第n个元素赋值给idx第n项对应的向量位置,原生向量的测试结果完全符合该规则。
而0.6.5版本gmp包的[<-.bigz赋值方法未遵循该原生逻辑:方法内部会先对传入的索引向量做升序排序,再按排序后的正序位置匹配赋值,因此传入逆序索引3:2时,内部会先将索引重排为2:3,再将c(10,20)按顺序赋值给位置2、3,最终得到和原生向量不一致的结果。
临时规避方案
如果需要对bigz对象做非正序索引赋值,可以采用两种方式规避该问题:
- 拆分赋值语句,手动按索引顺序逐个赋值
- 先将
bigz对象转为原生列表存储值,完成赋值操作后再转回bigz类型
内容的提问来源于stack exchange,提问作者Carl Witthoft
相关产品推荐
相关产品推荐

