4.2 从公式中提取组分

4.2 从公式中提取组分

4.2.1 问题

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

4.2.2 方案

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

f <- y ~ x1 + x2

## 观察f结构
str(f)
#> Class 'formula'  language y ~ x1 + x2
#>   ..- attr(*, ".Environment")=<environment: R_GlobalEnv>

## 获得每一部分
f[[1]]
#> `~`
f[[2]]
#> y
f[[3]]
#> x1 + x2

## 转换为列表观察
as.list(f)
#> [[1]]
#> `~`
#>
#> [[2]]
#> y
#>
#> [[3]]
#> x1 + x2

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

f2 <- ~x1 + x2
as.list(f2)
#> [[1]]
#> `~`
#>
#> [[2]]
#> x1 + x2

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

str(f[[1]])
#>  symbol ~
str(f[[2]])
#>  symbol y
str(f[[3]])
#>  language x1 + x2

## 查看语言对象某部分
str(f[[3]][[1]])
#>  symbol +
str(f[[3]][[2]])
#>  symbol x1
str(f[[3]][[3]])
#>  symbol x2

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

as.character(f[[1]])
#> [1] "~"
## > [1] '~'
as.character(f[[2]])
#> [1] "y"
## > [1] 'y'

## 这里语言对象被强制转换为代表解析树的字符向量
as.character(f[[3]])
#> [1] "+"  "x1" "x2"
## > [1] '+' 'x1' 'x2'

## 使用 deparse() 获取更为自然的结果
deparse(f[[3]])
#> [1] "x1 + x2"
deparse(f)
#> [1] "y ~ x1 + x2"

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

environment(f)
#> <environment: R_GlobalEnv>