2017-03-21 6 views
2

Ich habe eine Funktion, die 2 Zahlen (geographische Koordinaten) zurückgeben sollte.
Kann die Funktion 2 Zahlen zurückgeben?in SAS proc fcmp Wie bekomme ich 2 Zahlen zurückgegeben

Hier ist meine Funktion ist (Ich brauche x und Y zurück)

proc fcmp outlib=common.functions.geo; 
    function latlng2lambert72(lat,lng); 

     LongRef = 0.076042943; 
     bLamb = 6378388 * (1 - (1/297)); 
     aCarre = 6378388 ** 2; 
     eCarre = (aCarre - bLamb ** 2)/aCarre; 
     KLamb = 11565915.812935; 
     nLamb = 0.7716421928; 

     eLamb = sqrt(eCarre); 
     eSur2 = eLamb/2; 

     *conversion to radians; 
     lat_rad = (constant("pi")/180) * lat; 
     lng_rad = (constant("pi")/180) * lng; 

     eSinLatitude = eLamb * sin(lat_rad); 
     TanZDemi = (tan((constant("pi")/4) - (lat_rad/2))) * 
        (((1 + (eSinLatitude))/(1 - (eSinLatitude))) ** (eSur2)); 

     RLamb = KLamb * ((TanZDemi) ** nLamb); 

     Teta = nLamb * (lng_rad - LongRef); 

     x = 150000 + 0.01256 + RLamb * sin(Teta - 0.000142043); 
     y = 5400000 + 88.4378 - RLamb * cos(Teta - 0.000142043); 
     *put x y ; 

     return (x); 
     *return (x*1000000000000 + y); 
     *return (x||'_'||y); 
    endsub; 
quit; 

data test; 
    lat = 50.817500; 
    lng = 4.374400; 
    x = latlng2lambert72(lat,lng); 
    run; 

Ich denke, nicht aber dann ist die einzige Option, die ich sehen würde zwei Funktionen zu machen und hat eine die erste Nummer zurückkehren und die anderen gib die 2. Nummer zurück. Diese 2 Funktionen wären zu 99% identisch und ich möchte keinen Code duplizieren. Gibt es einen effizienteren Weg, dies zu erreichen?

(ich nicht wirklich verstehen, wie Funktionen arbeiten. Könnten sie zu diesem Zweck verwendet werden? Den gemeinsamen Code ausführen und nur 2 kurze Funktionen machen x und y zurück?)

Antwort

2

Funktionen per Definition Rückkehr eines einzelnen Wert; das ist die Definition einer Funktion. Es sollte in der Lage sein, auf der rechten Seite eines Gleichheitszeichens zu sein.

Unterroutinen, in SAS als Call-Routinen bekannt, können null, einen oder mehrere Werte "zurückgeben". Sie tun dies, indem Sie nichts direkt zurückgeben (Sie können keine call Routine auf die rechte Seite eines Gleichheitszeichens setzen), sondern indem Sie die Argumente ändern, mit denen sie aufgerufen werden.

Sie sehen dies in Routinen wie call missing, die eine beliebige Anzahl von Werten auf fehlende setzen können; Sie sehen es etwas direkter in Routinen wie call scan, die Ihnen die Startposition und Länge des n-ten Wortes in einer Zeichenfolge angibt.

Um dies zu tun, dann würden Sie zuerst Ihre Funktion zu einem Unterprogramm/Call-Routine zu ändern, das heißt ersetzen function mit subroutine und dann OUTARGS angeben.

Ein Beispiel dafür wäre:

proc fcmp outlib=work.funcs.func; 
    subroutine roots(inval, outval_pos, outval_neg); 
    outargs outval_pos,outval_neg; *specifies these two will be "returned"; 
    outval_pos = sqrt(inval); 
    outval_neg = -1*outval_pos; 
    endsub; 
quit; 

options cmplib=work.funcs; 

data _null_; 
x=9; 
call missing(y_pos,y_neg); 
call roots(x,y_pos, y_neg); 
put x= y_pos= y_neg=; 
run;