如何在R中使用宏变量? (类似于SAS中的%LET)

时间:2015-02-12 17:35:22

标签: r

如何在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 个答案:

答案 0 :(得分:16)

让我提供一个替代解决方案,因为没有必要通过必须解析的字符串去概念性绕道:

R允许您通过一组函数(如substitutebquote)在运行时处理表达式(不将它们编码为字符串)。 bquote可能最接近SAS方法:

depvar = quote(sales.int)
reg = lm(bquote(.(depvar) ~ var1 + var2), mydata)

bquote基本上采用R表达式,并将.(…)包围的每个变量替换为其值。第一行为变量分配名称 - 这与SAS中的实际宏非常相似。这需要被quote包围,否则R会尝试将sales.int内容分配给depvar,而不是名称。 quotebquote的工作方式相同,只是您不能在其中使用.(…)语法来替换现有变量。

您还可以从用户输入中确定此名称(即使用as.name从字符串中确定:

depvar = as.name('sales.int')

as.name将字符串转换为R对象名称。


只是对语言设计的评论,因为这是一个常见的误解:在这方面,R可能不如SAS那么直观,但它在概念上更加一致且普遍适用。非R统计软件包本质上提供了解决语言的方法,而R将公式精美地集成到语言本身中。

答案 1 :(得分:7)

怎么样:

reg<-lm(formula(paste(depvar ,'~  var1 + var2')), data=mydata)

答案 2 :(得分:-2)

它们都不起作用。使用&amp;调用宏变量。在SAS但没有相似的&amp;在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