如何使lm解释公式中的eval

时间:2014-10-30 16:09:17

标签: 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)

这样可以正常工作并产生正确的输出。但是,当我试图拥有多个参数时:

 lm(Y~X1+X2, data=Test)
 XT2<-"X1+X2"
 lm(Y~eval(parse(text=XT2)), data=Test)

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

 parse(text=XT1)
 parse(text=XT2)

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

2 个答案:

答案 0 :(得分:5)

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

lm(as.formula(paste0("Y ~ ", XT2)), data=Test)

请注意,更好的策略是:

lm(Y ~ ., data=Test[, c("Y", "X1", "X2")])

答案 1 :(得分:2)

使用eval(parse(x))执行字符串x作为代码,因此在这种情况下,首先添加X1和X2创建1个变量,然后运行回归。