Pergunta

No meu código eu tenho várias macros. Macro A é a macro principal. Macro A então chamadas macro B que por sua vez chama macro C.

Em SAS, que eu tenho para defini-los em ordem para trás? Em outras palavras, eu tenho que definir macro C primeiro, depois macro B, então A macro passado? Ou que importa desde SAS lê todo o código antes que ela realmente atinge o comando para executar as macros? Para essa matéria, eu posso emitir o comando para executar a macro como a primeira instrução no meu código e, em seguida, definir as macros abaixo do comando?

Obrigado!

Foi útil?

Solução

Primeiro, você deve definir uma macro antes de ser chamado.

Em segundo lugar, não importa onde a macro é invocada, enquanto ele é carregado antes de mão.

Para elaborar o seu problema: A biblioteca autocall é seu amigo. Se você administrador do SAS não lhe permitirá colocar suas macros na biblioteca autocall, você pode anexar o autocall assim:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 

Outras dicas

a macro tem de ser definida antes de ser chamado. por motivos de desempenho, é melhor não definir uma macro dentro de outro - se você fizer isso, então ele vai ser re-definida toda vez que você chamar a macro exterior. o seguinte funciona bem:

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/

Você deve definir uma macro antes de ser chamado, portanto, a linha com "% A" seria necessário para seguir a definição de A. macro A ordem das outras definições de macro não importa, contanto que eles são definidos antes de são chamados. Normalmente em meus programas que eu configurar uma macro principal como você descreve, em seguida, a última linha do programa chama esta macro.

Outra opção a considerar é a criação de uma biblioteca autocall macro, que contém as definições de muitas macros. Isso funciona melhor para macros reutilizáveis, para que você não tem que redefini-los em cada programa.

Existem dois aspectos do código de macro no SAS a serem definidas: o código de macro que é compilado e os parâmetros macro:

Código de macro:

O próprio código de macro é muito simples em que, quando o token %macro é encontrado o sistema começa SAS para compilar uma macro SAS e mantém a compilação até que ela atinge um símbolo %mend. Os problemas só reais você pode vir acima de encontro é se você atualiza o código de macro e não recompilar-lo antes de executá-lo - nessas situações ainda vai executar a versão antiga tem na biblioteca macro. Por extensão, se você tentar compilar uma macro que chama outro macro que já não tenha sido definido, em seguida, você receberá um erro. Por estas razões, eles precisam ser programadas pela ordem em que eles são chamados (como mostrado no exemplo abaixo:% level3 vem antes de% level2, que vem antes de% level1)

As variáveis ??de macro: Ao definir macro variáveis ?? existem dois escopos: Global e Local. Uma vez definido, variáveis ??globais podem ser acessados ??em qualquer lugar e a qualquer momento. No entanto, as variáveis ??locais só existem localmente durante a execução da macro no qual foi definido. Por extensão, se a macro onde a variável local foi definido chamadas quaisquer outras macros, a variável de macro local vai ainda ser acessível:

Exemplo de Trabalho:

No exemplo a seguir, as macros são definido na ordem inversa para evitar SAS retornar um invocação aparente de macro aviso.

O diagrama a seguir ilustra a estrutura dos seguintes macros no exemplo que se segue:

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

compilar os macros aninhadas:

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

compilar o macro nível superior (que por sua vez chama o acima de dois macros) e executá-lo:

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

pontos a observar aquando da revisão do log:

  • Fora% level3, & I retorna um aviso de que a variável de macro faz não existe
  • Dentro% level3, quando o & G1 é chamado, ele retorna o valor armazenado no o escopo local de fora% level3.Once de% level3, o valor retorna ao valor armazenado globalmente
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top