升级R 4.4.0后Quarto文档渲染失败,报.make_numeric_version()错误
R 4.4.0 下 Quarto 渲染描述统计表格报错的排查与解决
报错相关代码(第122-160行)
# First we create a subset of data that we want a summary of. selected_vars <- c("y0age", "y1sex", "y1gen", "y1racm", "y0scr06", "y1eco") dem_data <- subset(data, select = selected_vars) # We need to convert labelled data into factors. dem_data <- dem_data %>% mutate(across(c(y1sex, y1gen, y1racm, y0scr06, y1eco), ~ haven::as_factor(.))) dem_data$y0age <- as.numeric(dem_data$y0age) dem_table <- gtsummary::tbl_summary( dem_data, include = c(y0age, y1sex, y1gen, y1racm, y0scr06, y1eco), missing = "no", type = (list( y0age ~ "continuous2") ), statistic = list( all_continuous() ~ "{mean} ({sd})", all_categorical() ~ "{n} ({p}%)" ), digits = list( all_continuous() ~ 2, all_categorical() ~ c(0, 2)), label = list( y0age ~ "Age", y1sex ~ "Sex Assigned at Birth", y1gen ~ "Gender Identity", y1racm ~ "Racial Identity", y0scr06 ~ "Sexual Orientation", y1eco ~ "Financial Hardship"))
渲染错误日志
processing file: Hope_Moderation.qmd |................... | 36% [unnamed-chunk-6] Quitting from lines at lines 122-160 [unnamed-chunk-6] (Hope_Moderation.qmd) Error in `.make_numeric_version()`: ! invalid non-character version specification 'x' (type: double) Backtrace: 1. global .main() 2. execute(...) 3. rmarkdown::render(...) 4. knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet) 5. knitr:::process_file(text, output) ... 26. flextable:::is_in_quarto() 28. base::Ops.numeric_version(...) 29. base::as.numeric_version(e1) 30. base::numeric_version(x) 31. base::.make_numeric_version(x, strict, .standard_regexps()$valid_numeric_version) Execution halted
会话信息
sessionInfo() # R version 4.4.0 (2024-04-24) # Platform: aarch64-apple-darwin20 # Running under: macOS Sonoma 14.4.1
问题描述
将R版本升级至4.4.0后,原本可正常运行的Quarto文档无法渲染,但相同代码在Rmarkdown中能正常执行。使用haven包导入SPSS的.sav格式数据,执行上述数据处理与生成描述统计表格的代码时触发上述错误。
解决方案
这个错误源于flextable包旧版本与R 4.4.0的兼容性问题,flextable::is_in_quarto()函数的版本号类型处理逻辑未适配R 4.4.0的numeric_version更新。
优先方案:升级flextable到最新版本
在R控制台执行以下命令更新包:install.packages("flextable")最新版的flextable已经修复了该兼容性问题,升级后重新渲染Quarto文档即可正常运行。
临时修复方案(若升级仍有问题)
如果暂时无法升级包,可以在代码开头覆盖is_in_quarto函数,规避版本号比较步骤:assignInNamespace( "is_in_quarto", function() { !is.na(Sys.getenv("QUARTO_VERSION", unset = NA)) }, ns = "flextable" )这段代码会替换flextable内部的
is_in_quarto函数逻辑,直接通过环境变量判断是否在Quarto环境中。
内容的提问来源于stack exchange,提问作者SJ Kim
相关产品推荐
相关产品推荐

