如何在 SAS 宏中向用户询问字符串参数?

How do you ask a user for a string param in a SAS macro?

我正在尝试计算用户的描述性统计信息。该宏采用 'type' 参数。该类型是一个字符串,稍后将在代码中使用。

%macro descriptive_stats(data, reqvar, type, filter);
    proc means data = &data &type$;
        var &reqvar;
        by &filter;
    run;
%mend descriptive_stats;


%descriptive_stats(test, &num_var, 'mean', fyear)

我收到以下错误:

Syntax error, expecting one of the following: ;, (, ALPHA, CHARTYPE ...

我知道我为什么会收到错误消息。但我不明白为什么字符串 'mean' 没有被替换。

宏参数没有类型。宏参数中没有'numeric'或'character'。它们也不应该有引号,除非在最终代码中需要引号。宏变量(和参数)只是文本替换 - 所以如果您要在代码中键入 ' 然后包含它(或者更好的是,将 " 放在参数周围);否则不要。

%macro descriptive_stats(data, reqvar, type, filter);
    proc means data = &data &type;
        var &reqvar;
        by &filter;
    run;
%mend descriptive_stats;


%descriptive_stats(test, &num_var, mean, fyear)

我也不确定 $ 的来源 - 在这种情况下,这在 SAS 中没有任何意义。

SAS 宏语言基本上是复杂的 copy/paste。它只处理字符串,这使得引用与 data 步引用非常不同。当您通过宏传递值 'mean' 时,它会传递引号。

对于 SAS,它正在查看:

proc means data = test 'mean'$;
...
run;

告诉 PROC MEANS 只计算平均值的语法不正确。相反,您只想传递不带引号的单词 mean(或 $ 符号;PROC MEANS 中不需要 $ 符号)。然后 SAS 将看到:

proc means data=test mean;
...
run;

有关宏引用的详细信息,请查看 this article