正确解析R中的“公式”对象

问题描述 投票:0回答:1

如何正确解析 R 公式对象 (

fo
)(即解析时不将其转换为字符串)?

假设我有以下内容:

## Creating a formula object
fo <- y ~ x1 + x2 | 0 + z1 + z2 + z3 + z4 + z5

class(fo)
##[1] "formula"

typeof(fo)
##[1] "language"

strsplit(fo, split='|', fixed=TRUE)
##Error in strsplit(fo, split = "|", fixed = TRUE) : non-character argument

希望我想将其解析为三个原子向量:

  1. 因变量:
    c("y")
  2. 回归器:
    c("x1", "x2")
  3. 其他:
    c("z1", "z2", "z3", "z4", "z5")
    (不包括
    0
    )。
r string parsing formula
1个回答
7
投票

公式的树结构分解如下:

  • 顶层:
    ~
    (y,响应)

在内部,这是一个类似列表的对象,其中第一个元素是运算符 (

~
),第二个元素是第一个参数,第三个元素是第三个参数。

所以

deparse(fo[[2]])
让你“y”

  • 下一级(响应):
    |
    (x1+x2,0 + ...)。相同的一般结构(第一个元素是运算符
    |
    ,第二个元素是第一个参数,第三个元素是第二个参数)

所以

fo[[c(3,2)]]
得到
x1+x2

all.vars(fo[[c(3,2)]])

获取栏左侧的变量

all.vars(fo[[c(3,3)]])

获取栏右侧的变量

如果您想提取terms而不是变量,这会变得相当棘手;例如

all.vars(quote(log(x))
得到“x”,而不是“log(x)”

可能有用,您还可以使用

lobster::ast()
显示抽象语法树(AST):

> lobstr::ast(y ~ x1 + x2 | 0 + z1 + z2 + z3 + z4 + z5)
█─`~` 
├─y 
└─█─`|` 
  ├─█─`+` 
  │ ├─x1 
  │ └─x2 
  └─█─`+` 
    ├─█─`+` 
    │ ├─█─`+` 
    │ │ ├─█─`+` 
    │ │ │ ├─█─`+` 
    │ │ │ │ ├─0 
    │ │ │ │ └─z1 
    │ │ │ └─z2 
    │ │ └─z3 
    │ └─z4 
    └─z5 
© www.soinside.com 2019 - 2024. All rights reserved.