You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何忽略spec_tbl_df的problems属性测试tibble数据相等性?

如何判断仅因spec_tbl_df空problems指针不同的tibble是否相等?

当你用readr::read_csv()读取同一文件得到两个tibble时,即使数据内容完全一致,identical()也可能返回FALSE——原因在于tibble的spec_tbl_df子类中,空的problems属性是不同的对象(指针不同),但对你而言它们本质是相同的。以下是几种可行的解决方法:

方法1:方括号子集化移除spec_tbl_df的额外属性

通过tibble[]的方式可以移除tibble的spec_tbl_df子类属性,只保留基础的tibble结构,此时再用identical()就能正确判断数据是否一致:

library(tidyverse)

# 生成测试文件
tibble(x = 1:3) %>% write_csv(file = '~/Documents/demo.csv')

# 读取两次得到tibble
d1.tb <- read_csv(file = '~/Documents/demo.csv')
d2.tb <- read_csv(file = '~/Documents/demo.csv')

# 子集化后判断相等性
identical(d1.tb[], d2.tb[])
# [1] TRUE

方法2:用all.equal()替代identical()

identical()会严格比较所有属性(包括对象指针),而all.equal()默认会忽略这类非核心的属性差异,只比较数据的内容、结构和类型,直接就能得到正确结果:

all.equal(d1.tb, d2.tb)
# [1] TRUE

方法3:手动统一problems属性

如果你一定要用identical(),可以手动将两个tibble的problems属性设为同一个值(比如空对象或者相同的自定义值),这样指针就会一致:

# 复制原tibble
d1.1.tb <- d1.tb
d2.1.tb <- d2.tb

# 统一problems属性
attributes(d1.1.tb)$problems <- attributes(d2.tb)$problems
# 或者设为空:attributes(d1.1.tb)$problems <- tibble()

# 再用identical判断
identical(d1.1.tb, d2.1.tb)
# [1] TRUE

验证差异来源

你可以通过以下代码确认两个tibble仅在problems属性的指针上存在差异:

# 整体属性不同
identical(attributes(d1.tb), attributes(d2.tb))
# [1] FALSE

# 但problems的内容都是空的tibble
problems(d1.tb)
# A tibble: 0 × 5
# … with 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr>
problems(d2.tb)
# A tibble: 0 × 5
# … with 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr>

# 只是problems的指针不同
identical(attributes(d1.tb)$problems, attributes(d2.tb)$problems)
# [1] FALSE

内容的提问来源于stack exchange,提问作者uqbfitzpatrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:39:17