我在.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= "¯o_file."
outfile= "&server_file."
; run;
%include "&server_file.";
endrsubmit;
%mend include_on_server;
这允许我只需拨打%include_on_server(file="C:\my_file.sas")
,然后它就会包含在我的远程会话中。
答案 0 :(得分: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
答案 1 :(得分:1)
你有几个选择,其中一个是CarolinaJay的建议。另一个是如果你不介意在本地进行处理,你可以使用LIBNAME来引用服务器库:
libname server = 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结合在一起,甚至允许不兼容的机器协同工作。
答案 2 :(得分:1)
在宏定义周围的include中放入一个rsubmit / endrsubmit。当您包含本地文件时,它将远程编译宏。
编辑:
即
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 ;