为何toupper可处理english(1),但tools::toTitleCase却报错?
使用english包时toTitleCase与toupper的表现差异解析
我在RMarkdown文档中用english包按APA指南将数字转换为单词,直接用english()包裹数值就可以实现,非常方便。但需要让句首的数字单词首字母大写时,遇到了一个问题:
- 调用
tools::toTitleCase(english(1))会报错:Error in toTitleCase(english(1)) : 'text' must be a character vector - 但调用
toupper(english(1))却能正常返回"ONE"
我已经找到解决方案:toTitleCase(as.character(english(1))),不过想搞清楚两者表现不同的原因,另外还发现english::Words(1)可以直接满足首字母大写的需求。
原因解析
english()函数返回的是english类的专属对象,不是R默认的字符向量类型。- 基础函数
toupper()具备隐式类型转换能力,会自动把english对象转换成字符向量后再处理,所以能正常运行。 - 而
tools::toTitleCase()对参数类型要求严格,只接受字符向量,不会自动做类型转换,因此直接传入english对象就会触发报错,必须用as.character()显式转换类型才能正常使用。
更便捷的替代方案
english包提供了Words()函数,可以直接生成首字母大写的数字单词,无需额外转换操作:
english::Words(1) # 返回"One"
复现代码
install.packages("english") library(english) library(tools) # 报错的调用 toTitleCase(english(1)) # 正常运行的调用 toupper(english(1))
内容的提问来源于stack exchange,提问作者gladys_c_hugh
相关产品推荐
相关产品推荐

