Quarto自动输出字数统计遇问题:wordcountaddin插件返回NA
在Quarto中自动输出字数统计的解决方案
你遇到的问题核心有两个:一是渲染PDF时工作目录变化,导致text_stats找不到指定的.qmd文件;二是直接调用包的内部函数wordcountaddin:::text_stats本身不稳定,内部函数的输出格式或逻辑可能随包更新改变,这也是截取字符串后返回NA的原因。
下面给你几个可行的解决方法:
方案1:用Quarto原生Lua过滤器(推荐)
Lua过滤器是Quarto官方推荐的扩展方式,渲染时直接处理文档内容,不会有路径问题,统计更准确。
步骤:
- 在项目根目录创建
wordcount.lua文件,内容如下:
local word_count = 0 function Para(el) word_count = word_count + #el.content:walk{ Str = function(s) return #string.gmatch(s.text, "%S+") end } end function Doc(body, meta, vars) -- 在文档末尾添加字数统计 table.insert(body, pandoc.Para{ pandoc.Str("本文总字数:" .. word_count) }) return pandoc.Doc(body, meta, vars) end
- 在
_quarto.yml中添加过滤器配置:
filters: - wordcount.lua
渲染PDF时,会自动在文档末尾生成字数统计。如果想把统计放在特定位置,可以在文档中插入{{< wordcount >}}标记,再修改Lua过滤器实现替换逻辑。
方案2:改进R代码的路径与统计逻辑
如果仍想用R包统计,需解决路径问题并避免依赖内部函数:
{#wordcountdev, message = FALSE, warning = FALSE, echo = FALSE} library(here) library(wordcountaddin) # 用here()获取绝对路径,确保渲染时能定位到文件 doc_path <- here("CMI Write Up.qmd") # 使用包的导出函数word_count统计(比内部函数更稳定) word_count <- word_count(doc_path) cat("本文总字数:", word_count)
here包能自动识别项目根目录,避免渲染时工作目录变化导致的路径错误;同时用公开导出的word_count函数替代内部的text_stats,降低包更新带来的兼容性风险。
方案3:用quarto包读取内容自行统计
如果不想依赖第三方统计包,可直接读取文档内容并自定义统计规则:
{#wordcountdev, message = FALSE, warning = FALSE, echo = FALSE} library(here) doc_path <- here("CMI Write Up.qmd") # 读取文档内容 doc_content <- readLines(doc_path) # 过滤代码块和YAML头 filtered_content <- doc_content[!grepl("^```|^---", doc_content)] # 统计有效字数 word_count <- sum(sapply(strsplit(paste(filtered_content, collapse = " "), "\\s+"), length)) cat("本文总字数:", word_count)
这种方式完全自主控制统计规则,适合有特殊过滤需求的场景。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

