相同的R数据框却有不同哈希值(非属性问题)
数据框
identical()返回TRUE但digest()返回FALSE的排查过程 我有两个约150行的R数据框X和Y,identical(X, Y)返回TRUE,但identical(digest(X), digest(Y))返回FALSE,以下是排查过程:
属性一致性验证
已确认两个数据框的属性完全一致,测试结果如下:
> names(attributes(X)) [1] "names" "row.names" "class" > names(attributes(Y)) [1] "names" "row.names" "class" > digest(X) [1] "07b7ef11ce6eaae01ddd79e4facef581" > digest(Y) [1] "09d8abcab0af0a72265a9b690f4eacc3" > digest(X[1:nrow(X),]) [1] "2f338de9972529bd2bc9c39c3c5762ea" > digest(Y[1:nrow(Y),]) [1] "2f338de9972529bd2bc9c39c3c5762ea" > identical(X, Y, attrib.as.set=FALSE) [1] TRUE
RDS保存读取测试
将数据框保存为.RDS文件后重新读取,identical()仍返回TRUE,但digest()结果依旧不同:
> X_rds <- read_rds("cache_vars/X.rds") > Y_rds <- read_rds("cache_vars/Y.rds") > identical(X_rds , Y_rds ) [1] TRUE > digest(X_rds) [1] "07b7ef11ce6eaae01ddd79e4facef581" > digest(Y_rds ) [1] "09d8abcab0af0a72265a9b690f4eacc3" > identical(X_rds , Y_rds , attrib.as.set=FALSE) [1] TRUE
矩阵转换测试
将数据框转为矩阵再转回数据框后,哈希值变得一致,说明差异源于结构层面:
> X_Mat <- as.matrix(X_rds) > Y_Mat <- as.matrix(Y_rds) > identical(digest(X_Mat), digest(Y_Mat)) [1] TRUE > X_DF <- as.data.frame(X_Mat) > Y_DF <- as.data.frame(Y_Mat) > identical(digest(X_DF ), digest(Y_DF)) [1] TRUE
数据框生成背景
X由并行设计的循环生成(但使用了%do%标记,未实际并行),Y由顺序循环生成。
更新
MrFlick的判断正确,事实证明并行rbind函数的序列化过程添加了gp=0x20标记,与写入RDS时的情况类似。
内容的提问来源于stack exchange,提问作者b-dev
相关产品推荐
相关产品推荐

