格式化文本
有时候使用 paste( )连接文本并不是一个好主意,因为文本不得不被分离成多个小
段,而且随着格式越来越长,也会变得难以阅读。
举个例子,假设我们需要按以下格式打印出 students_df 中的每条记录:
#1, name: Tony, age: 26, major: Physics
在这种情况下,使用 paste( )将会很痛苦:
cat(paste("#", 1:nrow(students_df), ", name: ", students_df$name, ", age:
", students_df$age, ", major: ", students_df$major, sep =""), sep ="\n")
## #1, name: Tony, age:26, major: Physics
## #2, name: James, age:25, major: Economics
这样的代码看起来很杂乱,难以一眼看出其中的格式模板。相反,sprintf( )支持
格式模板,可以漂亮地解决这个问题:
cat(sprintf("#%d, name: %s, age: %d, major: %s",
1:nrow(students_df), students_df$name, students_df$age,
students_df$major), sep ="\n")
## #1, name: Tony, age: 26, major: Physics
## #2, name: James, age: 25, major: Economics
上述代码中,#%d, name: %s, age: %d, major: %s 是格式模板,其中%d 和%s
是用来表示输入参数并将其显示在字符串中的占位符。sprintf( )函数非常好用,因为它无
需将模板字符串分割开,用参数(占位符)分别指代需要被替换的部分。事实上,这个函数使
用 C 语言风格的格式规则,详情可以查看:https://en.wikipedia.org/wiki/Printf_format_string。
上述例子中,%s 表示字符串,%d 表示数字(整数)。此外,sprintf( )也可以通过
使用%f 来灵活地格式化数值。比如%.1f 表示将数值舍入到 0.1:
sprintf("The length of the line is approximately %.1fmm", 12.295)
## [1] "The length of the line is approximately 12.3mm"
实际上,不同类型的值有不同的语法格式,表 6-1 展示了最常用的语法。
表 6-1
格式 输出
sprintf("%s", "A") A
sprintf("%d", 10) 10
sprintf("%04d", 10) 0010
sprintf("%f", pi) 3.141593
sprintf("%.2f", pi) 3.14
sprintf("%1.0f", pi) 3
sprintf("%8.2f", pi) 3.14
sprintf("%08.2f", pi) 00003.14
sprintf("%+f", pi) +3.141593
sprintf("%e", pi) 3.141593e+00
sprintf("%E", pi) 3.141593E+00
小技巧:
官方文档(https://stat.ethz.ch/R-manual/R-devel/library/
base/html/sprintf.html)对各种支持的格式给出了完整的
说明。
注意到%在格式化文本中是一个特别的字符,被解释成一个占位符的初始字符。如果我
们真的需要表示%时,该怎么办?为了避免格式解析,需要使用%%来替代原文的%。示例代
码如下:
sprintf("The ratio is %d%%", 10)
## [1] "The ratio is 10%"