「R」从公式中提取组分

2020-07-02 21:30:18 浏览数 (2)

问题

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

方案

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

代码语言:javascript复制
f <- y ~ x1   x2

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

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

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

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

代码语言:javascript复制
f2 <- ~ x1   x2
as.list(f2)
#> [[1]]
#> `~`
#>
#> [[2]]
#> x1   x2
#>
#> <environment: 0x1e46710>

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

代码语言:javascript复制
str(f[[1]])
#>  symbol ~
str(f[[2]])
#>  symbol y
str(f[[3]])
#>  language x1   x2

# Look at parts of the langage object
str(f[[3]][[1]])
#>  symbol  
str(f[[3]][[2]])
#>  symbol x1
str(f[[3]][[3]])
#>  symbol x2

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

代码语言:javascript复制
as.character(f[[1]])
#> [1] "~"
as.character(f[[2]])
#> [1] "y"

# The language object gets coerced into a string that represents the parse tree:
as.character(f[[3]])
#> [1] " "  "x1" "x2"

# You can use deparse() to get a more natural looking string
deparse(f[[3]])
#> [1] "x1   x2"
deparse(f)
#> [1] "y ~ x1   x2"

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

代码语言:javascript复制
environment(f)
#> <environment: 0x1e46710>

0 人点赞