Как мне использовать макропеременную в 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
Другие вопросы по тегам