5

我有一个在本地计算机上创建的 .sas 文件中的宏。我还有一个用于测试宏的本地数据集。该数据集与远程数据集具有相同的描述符,但观察结果较少。现在,我正在尝试针对远程数据集运行我的本地宏。这基本上是我所拥有的:

这按预期工作:

%include "C:\my_sas_macro.sas";

%my_sas_macro(my_data=work.localdata)

但这会产生一个错误(错误如下):

%include "C:\my_sas_macro.sas";

rsubmit;
%my_sas_macro(my_data=remotelib.remotedata)
endrsubmit;

有错误的日志:

125  %include "C:\my_sas_macro.sas";
136
137  rsubmit;
NOTE: Remote submit to REMOTEID.__7551 commencing.
WARNING: Apparent invocation of macro MY_SAS_MACRO not resolved.
83   %my_sas_macro(my_data=remotelib.remotedata)
     -
     180
ERROR 180-322: Statement is not valid or it is used out of proper order.
84   endrsubmit;

NOTE: Remote submit to REMOTEID.__7551 complete.

我很确定我需要以某种方式将 %macro/%mend 块传输到服务器,但我不知道如何。我已经看到了,%SYSLPUT但那是针对宏变量而不是完整的宏。

无论如何,我可以在服务器上运行我的宏,而不必只通过 SSH 代码和%include它在那里?

谢谢!

[编辑] 实施的解决方案

因此,根据@CarolinaJay65 的回答,我想出了以下宏,到目前为止它对我来说效果很好。

%macro include_on_server(file=);
%let server_file = ~/temp.sas;
%SYSLPUT macro_file=&file;
%SYSLPUT server_file = &server_file;

rsubmit;

proc upload
    infile= "&macro_file."
    outfile= "&server_file."
; run;

%include "&server_file.";
endrsubmit;

%mend include_on_server;

这让我可以打电话%include_on_server(file="C:\my_file.sas"),然后它现在包含在我的远程会话中。

4

3 回答 3

6

如何使用Proc Upload

 rsubmit;
 Proc Upload
  infile='C:\my_sas_macro.sas'
  outfile='//server/my_sas_macro.sas' ;
 run;

 %include '//server/my_sas_macro.sas';
 %my_sas_macro(my_data=remotelib.remotedata)

或者您可以将整个宏分配给宏变量,然后使用 %syslput

于 2012-09-24T01:02:07.677 回答
1

你有几个选择,CarolinaJay 的建议就是其中之一。另一个是如果您不介意在本地进行处理,您可以使用 LIBNAME 来引用服务器库:

libname 服务器= slibref=; 所以 libname myserver server=unix slibref=work;

如果您的服务器在连接脚本中被命名为“unix”并且您想要它的工作目录。

PROC CATALOG,或者我认为也是 PROC COPY,可以与上面的服务器 libref 结合使用来复制代码,无论是作为宏还是简单地作为源代码。宏存储在一个目录 (SASMACR) 中,可以从一个 libref 复制到另一个(在这种情况下是从一台机器复制到另一台机器)。您还可以将用于创建宏的源存储在目录中并移动它,从而避免您必须编译宏。不过,这确实需要目录兼容,这取决于您在服务器上运行的操作系统类型与本地计算机的类型。

最后,您可以按照本文中的建议进行操作:http: //www.nesug.org/proceedings/nesug05/io/io2.pdf 它将目录解决方案和 PROC UPLOAD 结合在一起,即使不兼容的机器也可以一起工作。

于 2012-09-24T03:05:29.513 回答
1

在宏定义周围放置一个 rsubmit/endrsubmit 。当您包含本地文件时,它将远程编译宏。

编辑:

IE

c:\remote_macro.sas 包含以下内容:

rsubmit ;
  %MACRO MYMACRO ;
    /* do stuff */
  %MEND ;

  %MACRO ANOTHERMACRO(PARAM) ;
    /* Do other things */
    %PUT &PARAM ;
  %MEND ;
endrsubmit ;

然后在 SAS 中运行以下命令:

%inc "c:\remote_macro.sas" ;

rsubmit ;
  %MYMACRO ;
  %ANOTHERMACRO(Hello World) ;
endrsubmit ;
于 2012-09-24T09:29:18.317 回答