2014-10-30 2 views
1

Я надеялся получить lm(), чтобы принять строку символов в качестве ввода формулы, но это не совсем работает. Это работает до сих пор:Как сделать lm интерпретировать eval в формуле

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 и (гипотетически) бесконечностью.

ответ

5

Не используйте eval(parse()), пока вы не являетесь продвинутым пользователем R (и тогда вам это обычно не понадобится). Просто используйте as.formula:

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

Обратите внимание, что лучшая стратегия для вашей цели будет:

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

с Eval (синтаксический анализ (х)) вы выполняете строку й в качестве кода, так что в этом случае вы сначала добавьте X1 и X2, создав 1 переменную, а затем запустите регрессию.

Смежные вопросы