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

Álv*_*gas 4 string parsing r formula

如何fo正确解析 R 公式对象 ( )(即解析时不将其转换为字符串)?

假设我有以下内容:

## 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 因变量:c("y").
  2. 回归量:c("x1", "x2").
  3. 其他:(c("z1", "z2", "z3", "z4", "z5")不包括0)。

Ben*_*ker 7

公式的树结构分解如下:

\n
    \n
  • 顶层:~(y,响应)
  • \n
\n

在内部,这是一个类似列表的对象,其中第一个元素是运算符 ( ~),第二个元素是第一个参数,第三个元素是第三个参数。

\n

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

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

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

\n
all.vars(fo[[c(3,2)]])\n
Run Code Online (Sandbox Code Playgroud)\n

获取条形图左侧的变量

\n
all.vars(fo[[c(3,3)]])\n
Run Code Online (Sandbox Code Playgroud)\n

获取条形右侧的变量

\n

如果您想提取项而不是变量,这会变得相当棘手;例如all.vars(quote(log(x))得到“x”,而不是“log(x)”

\n

可能有用,您也可以使用lobster::ast()显示抽象语法树(AST):

\n
> lobstr::ast(y ~ x1 + x2 | 0 + z1 + z2 + z3 + z4 + z5)\n\xe2\x96\x88\xe2\x94\x80`~` \n\xe2\x94\x9c\xe2\x94\x80y \n\xe2\x94\x94\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`|` \n  \xe2\x94\x9c\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n  \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80x1 \n  \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80x2 \n  \xe2\x94\x94\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n    \xe2\x94\x9c\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n    \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x96\x88\xe2\x94\x80`+` \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x800 \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80z1 \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80z2 \n    \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80z3 \n    \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80z4 \n    \xe2\x94\x94\xe2\x94\x80z5 \n
Run Code Online (Sandbox Code Playgroud)\n