如何使lm解释公式中的eval

Man*_*auf 1 r

我希望让lm()接受一个字符串作为公式输入,但它不是很有效.这项工作到目前为止:

 Test<-as.data.frame(matrix(sample(1:100, 12), 4, 3))
 colnames(Test)<-c("Y", "X1", "X2")
 lm(Y~X1, data=Test)
 XT1<-"X1"
 lm(Y~eval(parse(text=XT1)), data=Test)
Run Code Online (Sandbox Code Playgroud)

这很好,并产生正确的输出.但是,当我试图拥有多个参数时:

 lm(Y~X1+X2, data=Test)
 XT2<-"X1+X2"
 lm(Y~eval(parse(text=XT2)), data=Test)
Run Code Online (Sandbox Code Playgroud)

这不会产生相同的结果.我想知道为什么因为显然字符串都被正确解释:

 parse(text=XT1)
 parse(text=XT2)
Run Code Online (Sandbox Code Playgroud)

对于背景:最后这应该在一个函数中工作,其中提供了一个参数矩阵,XT2字符串应该从矩阵的名字中动态创建,所以我需要一个适用于所有可能的XT2的解决方案长度在1和(假设)无穷大之间.

Rol*_*and 5

eval(parse())您是高级R用户之前不要使用(然后您通常不需要它).只需使用as.formula:

lm(as.formula(paste0("Y ~ ", XT2)), data=Test)
Run Code Online (Sandbox Code Playgroud)

请注意,为您的目标制定更好的策略是:

lm(Y ~ ., data=Test[, c("Y", "X1", "X2")])
Run Code Online (Sandbox Code Playgroud)