4.2 从公式中提取组分

4.2.1 问题

你想抽离公式的一部分用来使用。

4.2.2 方案

你可以把公式对象当作列表看待,使用 [[ 操作符对其组分进行操作。

  1. f <- y ~ x1 + x2
  2. # 观察f结构
  3. str(f)
  4. #> Class 'formula' language y ~ x1 + x2
  5. #> ..- attr(*, ".Environment")=<environment: R_GlobalEnv>
  6. # 获得每一部分
  7. f[[1]]
  8. #> `~`
  9. f[[2]]
  10. #> y
  11. f[[3]]
  12. #> x1 + x2
  13. # 转换为列表观察
  14. as.list(f)
  15. #> [[1]]
  16. #> `~`
  17. #>
  18. #> [[2]]
  19. #> y
  20. #>
  21. #> [[3]]
  22. #> x1 + x2

如果公式左边没有任何东西,那么列表只有两个元素:

  1. f2 <- ~x1 + x2
  2. as.list(f2)
  3. #> [[1]]
  4. #> `~`
  5. #>
  6. #> [[2]]
  7. #> x1 + x2

公式的每一个元素都是一个符号或者语言对象(包含多个符号):

  1. str(f[[1]])
  2. #> symbol ~
  3. str(f[[2]])
  4. #> symbol y
  5. str(f[[3]])
  6. #> language x1 + x2
  7. # 查看语言对象某部分
  8. str(f[[3]][[1]])
  9. #> symbol +
  10. str(f[[3]][[2]])
  11. #> symbol x1
  12. str(f[[3]][[3]])
  13. #> symbol x2

你可以使用 as.character()deparse() 函数将它们转为字符串。 deparse() 函数可以返回一个看起来更为自然的结果:

  1. as.character(f[[1]])
  2. #> [1] "~"
  3. # > [1] '~'
  4. as.character(f[[2]])
  5. #> [1] "y"
  6. # > [1] 'y'
  7. # 这里语言对象被强制转换为代表解析树的字符向量
  8. as.character(f[[3]])
  9. #> [1] "+" "x1" "x2"
  10. # > [1] '+' 'x1' 'x2'
  11. # 使用 deparse() 获取更为自然的结果
  12. deparse(f[[3]])
  13. #> [1] "x1 + x2"
  14. deparse(f)
  15. #> [1] "y ~ x1 + x2"

正如我们在运行 str(f) 命令时看到的那样,公式对象也会捕捉调用它的环境。如果要抽取它,可以使用 environment() 函数:

  1. environment(f)
  2. #> <environment: R_GlobalEnv>