Как мне использовать макропеременную в R? (Аналогично%LET в SAS)
Как мне назначить макропеременную в R?
В SAS я бы использовал следующий код
%LET DEPVAR = sales_ind
PROC REG DATA=mydata;
MODEL &DEPVAR = VAR1 + VAR2;
RUN;
Однако в R я пытаюсь сделать что-то подобное (это не работает)
depvar <<- sales_ind
reg<-lm(depvar ~ var1 + var2, data=mydata)
Есть идеи?
Спасибо!
3 ответа
Как насчет этого:
reg<-lm(formula(paste(depvar ,'~ var1 + var2')), data=mydata)
Позвольте мне предложить альтернативное решение, потому что нет необходимости проходить концептуальный обход через символьные строки, которые должны быть проанализированы:
R позволяет вам манипулировать выражениями во время выполнения (не кодируя их как строки, то есть) с помощью набора функций, таких как substitute
или же bquote
, bquote
вероятно, ближе всего подходит к подходу SAS:
depvar = quote(sales.int)
reg = lm(bquote(.(depvar) ~ var1 + var2), mydata)
bquote
по сути, принимает выражение R и заменяет каждую переменную, которая окружена .(…)
по своей стоимости. Первая строка присваивает имя переменной - это очень похоже на фактический макрос в SAS. Это должно быть окружено quote
потому что в противном случае R будет пытаться присвоить содержимое sales.int
в depvar
, а не его имя. quote
работает идентично bquote
за исключением того, что вы не можете использовать .(…)
Синтаксис в нем, чтобы заменить существующие переменные.
Вы также можете определить это имя из пользовательского ввода (то есть из строки символов, используя as.name
:
depvar = as.name('sales.int')
as.name
преобразует строку символов в имя объекта R.
Просто комментарий о структуре языка, поскольку это распространенное заблуждение: R может быть менее интуитивным, чем SAS в этом отношении, но концептуально он гораздо более последовательный и в целом применимый. Пакеты статистики, не относящиеся к R, по существу предоставляют хаки для работы с языком, а R прекрасно интегрирует формулы в сам язык.
Ни один из них не работает. Макропеременная вызывается с & в SAS, но не похожа и используется в R, хотя вы можете использовать new=as.name("f3") или new=quote(f3) для ссылки на f3, как показано ниже.
> test<-data.frame(f1=c(1,2), f2=c("a","b")); test
# f1 f2
#1 1 a
#2 2 b
> new=as.name("f3"); new;
#f3
> new=quote(f3); new;
#f3
> # you still get new rather than f3 as expected
> new<-test$f1;
> new
#[1] 1 2