0
点赞
收藏
分享

微信扫一扫

格式化文本

扒皮狼 2022-05-25 阅读 76

有时候使用 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%"




举报

相关推荐

0 条评论