我希望让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和(假设)无穷大之间。
答案 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个变量,然后运行回归。