如何正确解析 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
希望我想将其解析为三个原子向量:
c("y")
。c("x1", "x2")
。c("z1", "z2", "z3", "z4", "z5")
(不包括0
)。公式的树结构分解如下:
~
(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