#r #eval #lm #evaluation #expression-evaluation
#r #вычисление #lm #оценка #выражение-вычисление
Вопрос:
Из этих строк
data = "mtcars"
y = "mpg"
x = c("cyl","disp")
Я пытаюсь выполнить линейную модель. Я пробовал такие вещи, как
epp=function(x) eval(parse(text=paste0(x,collapse=" ")))
lm(data=epp(data),epp(y)~epp(x))
# Error in eval(expr, envir, enclos) : object 'cyl' not found
где последняя строка должна была быть эквивалентна
lm(data=mtcars,mpg~cyl disp)
Комментарии:
1. Вы получите поток людей, говорящих вам просто не делать этого вообще, если вы не предоставите какой-либо подробный контекст, который, как я предполагаю, включает в себя какое-то приложение, которое запрашивает данные, аргументы x и y у пользователя, а затем запускает линейную модель? Объяснение этого контекста, вероятно, предотвратит недопонимание и, вероятно, приведет к лучшим ответам.
2. @joran Моя цель — создать функцию, которая выполняет пошаговый выбор модели для MCMCglmm.
3. В этом случае кажется ужасно странным, что вы будете передавать символьное представление имени фрейма данных, а не самого объекта.
4. Да, вы подходите для data.frame. Причина заключалась (1) частично в целях обучения и (2) в том, что не нужно было копировать весь data.frame при передаче в функцию (но время копирования в любом случае довольно незначительно). Теперь я изменил это.
Ответ №1:
Это включает в себя две операции, которые обе описаны в нескольких записях SO, которые используют, возможно, по отдельности функции get
или as.formula
:
lm(data=get(data),
formula=as.formula( paste( y, "~", paste(x, collapse=" ") ) )
)
В обоих случаях вы используете текстовый / символьный объект для возврата языкового объекта. В первом аргументе get
возвращает ‘symbol’, который может быть вычислен, а во втором экземпляре as.formula
возвращает объект ‘formula’. @blmoore прав, сообщив нам, что lm
примет символьный объект, поэтому вызов as.formula здесь не нужен.
Комментарии:
1. Опереди меня в этом! Вы даже можете позволить
lm
выполнять приведение к формуле из символа2. @Remi.b: Хранители чистоты R советуют нам избегать использования
eval(parse(...
, потому что обычно это метод приведения R в режим макрообработки программирования. Комуblmoore
: Я не осознавал, что NSE перешел наlm
обработку символьных значений, но я думаю, что на самом деле это не создает никакой двусмысленности.