在Quarto/R Markdown中将数字和百分比格式化为文本的方法求助
解决方案:将百分比转换为英文文本的R方法
方法1:使用english包实现通用转换
english包可直接将数字转为英文表述,搭配简单逻辑即可处理百分比场景,还能覆盖常见的简化表述(如50%→Half):
# 安装并加载包 install.packages("english") library(english) library(stringr) # 定义转换函数 percent_to_text <- function(x, capitalize = FALSE) { # 预设常见特殊百分比的简化表述 special_cases <- c( 0.5 = "half", 0.25 = "a quarter", 0.75 = "three quarters", 0.1 = "one tenth", 0.2 = "one fifth" ) # 优先匹配特殊情况 if (as.character(x) %in% names(special_cases)) { result <- special_cases[as.character(x)] } else { # 普通百分比:转成整数后转英文,再拼接"percent" num_text <- as.character(english(x * 100)) result <- paste(num_text, "percent") } # 处理首字母大写需求 if (capitalize) { result <- str_to_sentence(result) } result } # 测试示例 percent_to_text(0.5, capitalize = TRUE) #> [1] "Half" percent_to_text(0.25) #> [1] "a quarter" percent_to_text(0.42, capitalize = TRUE) #> [1] "Forty-two percent" percent_to_text(25/50, capitalize = TRUE) #> [1] "Half"
方法2:结合papaja实现兼容转换
如果想继续使用papaja的数字转文本能力,可自定义函数兼容百分比场景:
library(papaja) library(stringr) percent_to_text_papaja <- function(x, capitalize = FALSE) { special_cases <- c( 0.5 = "half", 0.25 = "a quarter", 0.75 = "three quarters" ) if (as.character(x) %in% names(special_cases)) { result <- special_cases[as.character(x)] } else { # 用papaja处理整数部分,再拼接百分比后缀 num_text <- printnum(x * 100, numerals = FALSE, capitalize = FALSE) result <- paste(num_text, "percent") } if (capitalize) { result <- str_to_sentence(result) } result } # 测试示例 percent_to_text_papaja(0.42, capitalize = TRUE) #> [1] "Forty-two percent" percent_to_text_papaja(0.5, capitalize = TRUE) #> [1] "Half"
关于报错原因说明
你使用papaja::printnum或printp处理小数时触发报错,是因为numerals = FALSE参数仅对整数有效:当输入为小数时,printnum会调用formatC函数,而formatC并不支持numerals和capitalize参数,因此出现"unused arguments"错误。
内容的提问来源于stack exchange,提问作者maia-sh
相关产品推荐
相关产品推荐

