如何在 R 中拆分 "formula"

How to split a "formula" in R

我正在尝试用我在 R 编程方面的有限知识制作一个小型 R 程序包。我正在尝试使用以下参数:

formula=~a+b*X

其中 X 是向量,'a' 和 'b' 是函数调用中的常量。

我想知道的是,输入公式后,我想分别提取 (a,b) 和 X,并将它们用于函数调用内的其他数据操作。有没有办法在 R 中做到这一点?

非常感谢任何指导。

注意:为清楚起见编辑了我的问题

我正在寻找类似于 model.matrix() 输出的内容。上面提到的公式可以更一般化以适应 'n' 个变量,例如

~2+3*X +4*Y+...+2*Z

在输出中,我需要系数 (2 3 4 ...2) 作为向量,[1 X Y ... Z] 作为协变量矩阵。

问题并不完全清楚,所以我们假设问题是,给定一个使用标准公式语法的公式,我们如何解析变量名称(或在第二个答案中的变量名称和常量)给出输出包含它们的字符向量。

1) all.vars 试试这个:

fo <- a + b * X  # input
all.vars(fo)

给予:

[1] "a" "b" "X"

2) strapplyc 我们也可以通过字符串操作来实现。在这种情况下,它还会解析出常量。

library(gsubfn)
fo <- ~ 25 + 35 * X  # input
strapplyc(gsub(" ", "", format(fo)), "-?[0-9.]+|[a-zA-Z0-9._]+", simplify = unlist)

给予:

[1] "25" "35" "X" 

注意:如果您要做的只是评估公式的 RHS 作为 R 表达式,那么它只是:

X <- 1:3
fo <- ~ 1 + 2 * X
eval(fo[[2]])

给予:

[1] 3 5 7

更新:修复并添加了第二个解决方案和注释。

一个调用是一个符号列表and/or其他调用及其元素可以通过正常的索引操作访问,例如

f <- ~a+bX
f[[1]]
#`~`
f[[2]]
#a + bX
f[[2]][[1]]
#`+`
f[[2]][[2]]
#a

但是请注意,在您的公式中 bX 是一个符号,您可能指的是 b * X

f <- ~a + b * X

然后 ab 通常会存储在未计算的列表中。

vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]])
vars
#list(a, b)

vars 会在某个时候传递给 eval