3.2 通过变量创建字符串

3.2.1 问题

你想要通过变量创建一个字符串。

3.2.2 方案

两种从变量创建字符串的通用方法是使用 paste()sprintf() 函数。对向量来说,paste 更加有用;sprintf 则常用于对输出实现精确的控制。

3.2.2.1 使用 paste()

  1. a <- "apple"
  2. b <- "banana"
  3. # 将a、b变量内容连到一起,并用空格隔开
  4. paste(a, b)
  5. #> [1] "apple banana"
  6. # 如果不想要空格,可以设定参数 sep='', 或使用函数
  7. # paste0():
  8. paste(a, b, sep = "")
  9. #> [1] "applebanana"
  10. paste0(a, b)
  11. #> [1] "applebanana"
  12. # 用逗号加空格分开:
  13. paste(a, b, sep = ", ")
  14. #> [1] "apple, banana"
  15. # 设定一个字符向量
  16. d <- c("fig", "grapefruit", "honeydew")
  17. # 如果输入是一个向量,输出会将其每个元素堆叠到一起:
  18. paste(d, collapse = ", ")
  19. #> [1] "fig, grapefruit, honeydew"
  20. # 如果输入是一个标量和一个向量,
  21. # 结果会将标量与向量里每个元素放到一起
  22. # 并返回一个向量(译者注:R向量化操作的循环对齐原则):
  23. paste(a, d)
  24. #> [1] "apple fig" "apple grapefruit"
  25. #> [3] "apple honeydew"
  26. # 使用 sep 和 collapse 参数:
  27. paste(a, d, sep = "-", collapse = ", ")
  28. #> [1] "apple-fig, apple-grapefruit, apple-honeydew"

3.2.2.2 使用 sprintf()

另一种方式是使用 sprintf 函数,它来自于 C 语言。

想要在字符串或字符变量中进行取代操作,使用 %s

  1. a <- "string"
  2. sprintf("This is where a %s goes.", a)
  3. #> [1] "This is where a string goes."

如果是整数,可以使用 %d 或它的变体:

  1. x <- 8
  2. sprintf("Regular:%d", x)
  3. #> [1] "Regular:8"
  4. # 可以以空格开头,替代一定数量字符。
  5. sprintf("Leading spaces:%4d", x)
  6. #> [1] "Leading spaces: 8"
  7. # 也可以使用 0 替代一定数量字符。
  8. sprintf("Leading zeros:%04d", x)
  9. #> [1] "Leading zeros:0008"

对浮点数而言,使用 %f 进行标准释义,而 %e 或者 %E 则代表指数。你也可以使用 %g 或者 %G 让程序自动根据有效位数进行两种格式的转换。下面是 R help 页面中关于 sprintf 的例子:

  1. sprintf("%f", pi) # "3.141593"
  2. sprintf("%.3f", pi) # "3.142"
  3. sprintf("%1.0f", pi) # "3"
  4. sprintf("%5.1f", pi) # " 3.1"
  5. sprintf("%05.1f", pi) # "003.1"
  6. sprintf("%+f", pi) # "+3.141593"
  7. sprintf("% f", pi) # " 3.141593"
  8. sprintf("%-10f", pi) # "3.141593 " (左对齐)
  9. sprintf("%e", pi) # "3.141593e+00"
  10. sprintf("%E", pi) # "3.141593E+00"
  11. sprintf("%g", pi) # "3.14159"
  12. sprintf("%g", 1e6 * pi) # "3.14159e+06" (指数化)
  13. sprintf("%.9g", 1e6 * pi) # "3141592.65" (固定)
  14. sprintf("%G", 1e-6 * pi) # "3.14159E-06"

%m.nf 格式规范中:m 代表域宽,它是输出字符串中字符的最小位数,可以以空格或 0 开头。n 代表精度,它指小数点后的数字位数。

其他混合操作:

  1. x <- "string"
  2. sprintf("Substitute in multiple strings: %s %s", x, "string2")
  3. #> [1] "Substitute in multiple strings: string string2"
  4. # 想要打印百分号,可以使用 '%%'
  5. sprintf("A single percent sign here %%")
  6. #> [1] "A single percent sign here %"

3.2.2.3 注意

关于更多脚本输出的信息可以查看用 R 写入文本,分析输出到文件