如何在R中计算指定字体字号的字符串宽度且不生成文件
解决方案
方法1:Base R 原生方案(无需安装第三方包)
你之前调用par()生成空白PDF,是因为R在没有活跃图形设备时会自动启动默认PDF设备并写入本地文件。我们可以打开一个不写入本地文件的虚拟图形设备,计算完成后关闭设备即可,全程不会生成任何实体文件。
封装实现代码
# 自定义计算字符串宽度函数 get_strwidth <- function(text, font_size = 10, font_family = "sans", units = "inches") { # 打开虚拟PDF设备,file=NULL表示不输出到本地文件 pdf(file = NULL) # 设置字体、字号参数 par(ps = font_size, family = font_family) # 计算文本宽度 width <- strwidth(text, units = units) # 关闭虚拟设备 dev.off() return(width) }
测试验证
# 12号无衬线字体 get_strwidth("This is cool.", font_size = 12, font_family = "sans") # 输出:0.8541667 # 10号无衬线字体 get_strwidth("This is cool.", font_size = 10, font_family = "sans") # 输出:0.7291667 # 10号等宽字体 get_strwidth("This is cool.", font_size = 10, font_family = "mono") # 输出:1.083333
提示:Windows系统可将
pdf(file = NULL)替换为win.metafile(file = NULL),计算速度更快,跨平台场景下优先用pdf(file = NULL)兼容性最好。
方法2:第三方包方案(更简洁,无需操作图形设备)
如果允许安装第三方包,可以用systemfonts包直接计算文本宽度,全程不涉及图形设备,也不会生成任何文件:
使用示例
# 首次使用先安装包 # install.packages("systemfonts") library(systemfonts) # 计算12号无衬线字体的文本宽度,默认返回像素值 width_pixel <- string_width("This is cool.", size = 12, family = "sans") # 转换为英寸(印刷标准:1英寸=72像素) width_inch <- width_pixel / 72
内容的提问来源于stack exchange,提问作者David J. Bosak
相关产品推荐
相关产品推荐

