【问题标题】:Difference between defining SAS macrovariables via %let and call symput?通过 %let 定义 SAS 宏变量和调用 symput 之间的区别?
【发布时间】:2013-06-18 06:16:09
【问题描述】:

不知道有什么区别

%let m=产品和 cal symput('m', 'product') 是?

不是两个表达式都创建了一个具有值乘积的宏变量 m 吗?

【问题讨论】:

    标签: variables macros sas definition


    【解决方案1】:

    %let 是一个宏语句,您可以在开放代码或宏内部使用它。呼叫症状只能在 DATA 步中使用,不能在开放代码中使用。请注意,此 DATA 步可能在宏中。

    至于创建的变量的作用域,请看:

    http://www.lexjansen.com/phuse/2009/po/PO15.pdf

    【讨论】:

      【解决方案2】:

      %let 用于定义基于文本的宏变量或解析为文本的表达式。它在开放代码或宏中调用。 %let 自动修剪前导和尾随空白的宏变量。可以在here 找到文档。

      call symput(文档here)用于分配 SAS 数据集变量、解析为 SAS 数据集变量(或 PDV 变量)的表达式、字符值或解析为的表达式的内容一个字符值(包括一个数值,它以默认格式解析为其等效字符,通常为 BEST12。)。 call symput修剪前导或尾随空格,例如表达式

      %let x=5;
      %put [&x];
      

      给你一个与表达式有些不同的结果

      data _null_;
      call symput('y',5);
      run;
      %put [&y];
      

      call symputx(自 9.2 起可用)与%let 具有更相似的结果,因为它会修剪前导和尾随空白。这对于从数字创建的宏变量特别有用,因为这些变量通常有几个前导空格,就像上面的例子一样。

      %letcall symput\symputx 在作用域上也有一些不同。在开放代码(或不在宏中的数据步骤)中使用时都会将宏变量放在全局表中,但在宏中使用的%let 会将变量放在它已经存在的最本地表中,如果它做;即,如果您有一个global 变量&myvar,那么%let myvar=5; 将修改全局变量&myvar,而不是创建一个局部范围的变量。 call symput 将把变量放在最局部的非空符号表中,不管它是否已经存在于全局范围内。 call symputx 会做同样的事情,除非您指定一个可选参数来指示您希望放置哪个表。

      【讨论】:

      • 谢谢你的解释,乔。
      • 我做了测试。这很好。再次感谢您提供的知识。
      【解决方案3】:

      唯一的区别是调用%LETcall symput 的方法。

      %LET 用于开放代码中,而不是在数据步或过程中。

      call symput 在数据步中使用,而不是在开放代码中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        相关资源
        最近更新 更多