Quarto渲染PDF时读取.csv文件报错:存在重复键值
解决Quarto渲染PDF时flextable处理data.table的笛卡尔积报错
问题原因
报错来自data.table的内部函数vecseq(),但你当前代码里没有显式执行join操作,推测是flextable在处理data.table对象时触发了内部关联逻辑,而你的csv数据中存在重复键值,触发了笛卡尔积限制。之前在dplyr join时加allow.cartesian=TRUE无效,因为问题出在读取后的表格渲染环节,而非生成csv时的join步骤。
解决方案
1. 将data.table转换为普通data.frame
flextable对base R的data.frame支持更稳定,转成data.frame后可绕开data.table的内部逻辑:
#| warning: false #| echo: false require(data.table) require(flextable) fread("data/table.csv") |> as.data.frame() |> flextable(cwidth = c(1, 1, 1, 4)) |> fontsize(size = 8)
2. 改用tidyverse的读取函数替代fread
完全避开data.table对象,用readr::read_csv读取数据:
#| warning: false #| echo: false require(readr) require(flextable) read_csv("data/table.csv") |> flextable(cwidth = c(1, 1, 1, 4)) |> fontsize(size = 8)
3. 检查并清理csv中的重复数据
如果数据中存在重复行,先去重再渲染:
#| warning: false #| echo: false require(data.table) require(flextable) fread("data/table.csv") |> unique() |> flextable(cwidth = c(1, 1, 1, 4)) |> fontsize(size = 8)
若需要确认重复情况,可临时运行以下代码查看重复行数:
fread("data/table.csv") |> duplicated() |> sum()
内容的提问来源于stack exchange,提问作者Nikki Yu
相关产品推荐
相关产品推荐

