如何在R中拆分"公式"

Vin*_*tha 0 r r-package

我正在努力用R编程中的有限知识制作一个小R包.我试图使用以下参数:

formula=~a+b*X
Run Code Online (Sandbox Code Playgroud)

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

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

我真的很感激任何指导.

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

我正在寻找类似于model.matrix()输出的东西.上面提到的公式可以更通用化以适应'n'个变量,比方说,

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

在输出中,我需要系数(2 3 4 ... 2)作为矢量,并且[1 XY ... Z]作为协变量矩阵.

G. *_*eck 6

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

1)all.vars试试这个:

fo <- a + b * X  # input
all.vars(fo)
Run Code Online (Sandbox Code Playgroud)

赠送:

[1] "a" "b" "X"
Run Code Online (Sandbox Code Playgroud)

2)strapplyc我们也可以用字符串操作来完成它.在这种情况下,它还解析了常量.

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

赠送:

[1] "25" "35" "X" 
Run Code Online (Sandbox Code Playgroud)

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

X <- 1:3
fo <- ~ 1 + 2 * X
eval(fo[[2]])
Run Code Online (Sandbox Code Playgroud)

赠送:

[1] 3 5 7
Run Code Online (Sandbox Code Playgroud)

更新:修复并添加第二个解决方案和注意.


Ern*_*t A 6

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

f <- ~a+bX
f[[1]]
#`~`
f[[2]]
#a + bX
f[[2]][[1]]
#`+`
f[[2]][[2]]
#a
Run Code Online (Sandbox Code Playgroud)

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

f <- ~a + b * X
Run Code Online (Sandbox Code Playgroud)

然后a并且b通常将存储在未评估的列表中。

vars <- call('list', f[[2]][[2]], f[[2]][[3]][[2]])
vars
#list(a, b)
Run Code Online (Sandbox Code Playgroud)

并且varseval在某个时候传递给。