2016-10-06 4 views
0

Dieser Makro-String-Vergleich funktioniert auf mysteriöse Weise für mich. Das offensichtliche für mich wäre, dass das Ergebnis von %test1(intotest) und %test2(intotest) gleich ist.sas Makro-String-Vergleich entspricht nicht

%macro test1(intotest=); 
    %str(&intotest) = %str("b"); 
%mend; 

%macro test2(intotest); 
    %if %str(&intotest) = %str("b") %then 
     1; 
    %else 0; 
%mend EAF; 

data datatable; 
    fromtable = 'b'; 
    test1 = %test1(intotest=fromtable); 
    test2 = %test2(intotest=fromtable); 
run; 

Der Ausgang ist fromtable=b,test1=1,test2=0

Wie würde ich %test2() so umschreiben, dass es das gleiche Ergebnis wie %test1() gibt und immer noch die Informationen in der Datentabelle als Eingabe verwenden?

+1

Dies ist eine schreckliche Verwendung von Makro-Code. Bitte benutze das nicht. Wenn es sich nicht um eine akademische Übung handelt, was versuchen Sie wirklich? Proc fcmp ist für Funktionen. – Reeza

+1

Was bedeutet "% mend EAF"? Ich habe nur '% mend' ohne Argumente oder den Namen des Makros verwendet, das Sie beenden möchten. –

+0

@StigEide "Warnung: Fremdtext in% MEND-Anweisung ignoriert für Makrodefinition TEST1." –

Antwort

2

Die SAS-Sprache ist für die Daten in Datensätzen zu verarbeiten (und anderen Quellen). Die Makrosprache wurde entwickelt, um Text zu verarbeiten und SAS-Sprachcode zu generieren.

In Ihrem ersten Beispiel, Sie sind die Makrosprache erfolgreich mit SAS Code fromtable = "b"; und dann, dass SAS Code auswertet (für jeden Datensatz), in dem der Datenwert des Datensatzes Variable erzeugen fromtableb zu wörtlichen Wert gleich ist. Nebenbei, Sie brauchen nicht die Funktion% str().

Im zweiten Beispiel versuchen Sie (in der Hoffnung), die Makrosprache zu verwenden, um Daten zu verarbeiten, die in einer Datenschrittvariablen gespeichert sind. Die Makrosprache verarbeitet keine Datenschrittdaten. [Es gibt einige Ausnahmen, aber ich denke nicht, dass sie Ihrem Verständnis helfen würden.] Wie geschrieben, vergleicht die Makrosprache die Textzeichenfolge fromtable mit der Textzeichenfolge "b" (beachten Sie, dass die Zeichenfolge drei Zeichen lang ist, weil im Makrosprachangebot) Marken sind Teil des Wertes). Die Makrosprache weiß nicht, dass es eine Datenschrittvariable namens fromtable gibt. Es weiß nicht einmal, dass es Dinge wie Datenschritte, Datensätze und Datensatzvariablen gibt. Da die Textzeichenfolge fromtable ungleich der Textzeichenfolge "b" ist, gibt Ihr Makro 0 zurück.

1

Ihr Code ist gleich dieser Daten Schritt, nach dem Ausführen von Makros:

data datatable; 
    fromtable = 'b'; 
    test1 = fromtable = "b";; 
    test2 = 0; 
run; 
1

Das erste Makro erzeugt SAS-Code (einschließlich eines unerwünschten zusätzlichen Semikolons) und das zweite erzeugt nur ein einziges Wort ist entweder 0 oder 1. Schalten Sie die MPRINT-Option ein und der Unterschied wird im SAS-Protokoll offensichtlich.

67   data datatable; 
68    fromtable = 'b'; 
69    test1 = %test1(intotest=fromtable); 
MPRINT(TEST1): fromtable = "b"; 
70    test2 = %test2(intotest=fromtable); 
MPRINT(TEST2): 0 
71   run;