【问题标题】:How do I use a macro variable in R? (Similar to %LET in SAS)如何在 R 中使用宏变量? (类似于 SAS 中的 %LET)
【发布时间】:2018-03-15 21:37:37
【问题描述】:

如何在 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)

有什么想法吗?

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    让我提供一个替代解决方案,因为不需要通过必须解析的字符串走概念上的弯路:

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

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

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

    您还可以从用户输入(即从字符串中,通过使用as.name

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

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


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

    【讨论】:

      【解决方案2】:

      这个怎么样:

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

      【讨论】:

      • 这似乎行得通!谢谢乔普。它对我来说不如 SAS 解决方案直观 -
      • 在 R 中,您可以通过 a ~ b + c 指定公式文字(表达式),或者您可以使用公式创建字符串并调用 formula() 以基于字符串创建公式。 (PS。如果解决方案有效,您可以将其标记为正确以关闭问题)
      • 我会的 - 它告诉我需要等待 10 分钟才能将其标记为正确
      • R 没有词法分析器指令,这些指令告诉词法分析器(程序中将文本分隔为单个标记的部分)将代码中的文本位替换为另一位文本,方式LET 在 SAS 中执行。
      【解决方案3】:

      它们都不起作用。宏变量在 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
      

      【讨论】:

        猜你喜欢
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2013-07-16
        • 2013-06-16
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        相关资源
        最近更新 更多