2012-09-24 10 views
5

Ho una macro che ho creato sul mio computer locale in un file .sas. Ho anche un set di dati locale che ho usato per testare la macro. Questo set di dati ha gli stessi descrittori di un set di dati remoto, ma solo meno osservazioni. Ora, sto cercando di eseguire la mia macro locale contro il set di dati remoto. Qui è fondamentalmente quello che ho:Chiama la macro SAS locale nel blocco RSUBMIT?

Questo funziona come previsto:

%include "C:\my_sas_macro.sas"; 

%my_sas_macro(my_data=work.localdata) 

ma allora questo genera un errore (errore segue):

%include "C:\my_sas_macro.sas"; 

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

Il registro con l'errore:

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. 

Sono abbastanza sicuro di aver bisogno di trasferire in qualche modo il blocco% macro /% mend sul server, ma non riesco a capire fuori come Ho visto il %SYSLPUT ma quello è per le variabili di macro e non pieno.

C'è comunque che posso eseguire la mia macro sul server senza dover solo SSH sul codice e %include lì?

Grazie!

[Edit] implementato la soluzione

Quindi, sulla base 's @ CarolinaJay65 risposta mi si avvicinò con la seguente macro che sta lavorando abbastanza bene per me finora.

%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; 

Questo mi permette di chiamare solo %include_on_server(file="C:\my_file.sas") e poi è ora incluso nella mia sessione remota.

risposta

6

Come sull'utilizzo 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) 

o si potrebbe assegnare l'intera macro a una variabile macro quindi utilizzare% syslput

+0

Grazie, sarò controlla 'Upload proc;' Per completezza, saresti in grado di mostrare il modo corretto di "assegnare l'intera macro a una variabile macro"? –

+0

Grazie, questo funziona per me, ma è una specie di PITA perché devo gestire la struttura delle directory sul server (non creerà automaticamente le directory che non esistono). Terrò questa come risposta accetata a meno che non venga fornita qualche altra soluzione che non mi imponga di gestire i file sul lato server. –

+1

aggiungerei endrsubmit; alla fine per chiarire che tutto è eseguito da remoto. – vasja

1

Hai un paio di opzioni, una delle quali è il suggerimento di CarolinaJay. Un altro è se non ti interessa eseguire l'elaborazione localmente, puoi usare LIBNAME per fare riferimento alla libreria del server:

libname server = slibref =; so libname server myserver = unix slibref = work;

se il server è denominato 'unix' nello script di connessione e si desidera la sua directory di lavoro.

PROC CATALOG, o penso anche PROC COPY, può essere utilizzato in combinazione con un server libref come sopra per copiare il codice, sia come macro o semplicemente come codice sorgente. Le macro sono archiviate in un catalogo (SASMACR), che può essere copiato da un libref a un altro (in questo caso da una macchina all'altra). È anche possibile memorizzare l'origine per creare la macro in un catalogo e spostarla, impedendoti di dover compilare la macro. Ciò richiede tuttavia che i cataloghi siano compatibili, il che dipende dal tipo di sistema operativo in esecuzione sul server rispetto al computer locale.

Infine, è possibile seguire i suggerimenti in questo articolo: http://www.nesug.org/proceedings/nesug05/io/io2.pdf che combina la soluzione catalogo e PROC UPLOAD insieme per permettere alle macchine, anche non compatibili per lavorare insieme.

+0

+1 Grazie per i grandi dettagli! Per mia sfortuna, l'elaborazione locale non è un'opzione, poiché ho bisogno di lavorare con 12 set di dati di circa 6 GB ciascuno. –

+0

La soluzione PROC CATALOG funzionerà correttamente, quindi - solo la parte iniziale del suggerimento era per l'elaborazione locale (consultare il PDF). – Joe

1

Inserire un rsubmit/endrsubmit all'interno dell'inclusione, attorno alla definizione della macro. Quando si include il file locale, sarà possibile completare la macro da remoto.

EDIT:

cioè

c: \ remote_macro.sas contiene il qui sotto:

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

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

quindi eseguire il seguente in SAS:

%inc "c:\remote_macro.sas" ; 

rsubmit ; 
    %MYMACRO ; 
    %ANOTHERMACRO(Hello World) ; 
endrsubmit ; 
+0

Questo non funziona = (Il codice nel blocco rsubmit/endrsubmit termina con l'esecuzione nel contesto del server, che quindi dà l'errore: 'ATTENZIONE: il file fisico non esiste ...' e poi 'ERRORE: Impossibile aprire% INCLUDE file C: \ ... '. –

+0

Vedi modifica con codice di esempio. Penso che stai inserendo rsubmit attorno a% inc, non intorno alla macro entro% inc. –

+0

Grazie! Funziona perché hai il 'rsubmit;'/'endrsubmit;' blocca il tuo file macro, il che significa che non puoi includerlo localmente, dato che lo invierà sempre a distanza. Stavo cercando una soluzione che mi permettesse di essere in grado di includere un file sia a livello locale che remoto. –

Problemi correlati