如何将%LET参数传递给R中的sas脚本?

时间:2018-08-07 07:44:54

标签: r sas sas-macro

我有一个R脚本,可以让我在SAS中运行一个宏,就像这样(来自here的启发):

setwd("C:/myplace")
sas_script <- "MyScript.sas"
sas_log <- tempfile()
sas_out <- tempfile()


cmd <- sprintf(
  'sas.exe -nosplash -icon -sysin "%s"  -log "%s" -print "%s"',
  sas_script, sas_log, sas_out
)

return_code  <- system(cmd)  # Runs sas and saves the return code
print(return_code)

但是我想将一个参数传递给宏,这样我就可以运行它,例如从2010年到2018年的所有年份。我的SAS宏(调用其他几个宏)看起来像这样:

options nocenter nodate nonumber mprint;

%let sti=C:\Mypath\;
%include "&sti.macro1.sas" ;

%let aar=2018;

%macro1(aar=&aar);

因此,我不想在sas中使用%let aar=2018;,而是在R中执行类似for(aar in 2010:2018){ code }的操作。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用-sysparm命令行选项将值传递到SAS程序中。您可以使用&sysparm宏变量引用在SAS程序中引用该值。

答案 1 :(得分:3)

您可以在SAS命令行上使用-SET选项将参数传递给SAS。然后,使用%SYSGET宏在程序中检索这些值。有关进一步的讨论和示例,请参见文章"How to pass parameters to a SAS program."

答案 2 :(得分:2)

我不确定我是否理解您的问题,但是如果我是对的,那么您想从N年循环到另一年M,对吗?

因此,在SAS中,您可以在宏内部编写循环并运行宏。在您的示例中,我将这样做:

options nocenter nodate nonumber mprint;

%let sti=C:\Mypath\;
%include "&sti.macro1.sas" ;

%macro_loop(startyear,endyear);
%do year = &startyear. %to &endyear.;
    %macro1(aar = &year);
%end;
%mend;

%macro_loop(startyear = 2010, endyear = 2018);