2017-12-04 16 views
1

proc fcmp関数は、ハッシュオブジェクトをパラメータとして渡すことができます。ドキュメントは少し曖昧で、この機能が他のfcmp関数からの呼び出しに制限されているのか、データステップ呼び出しから許可されているのかについては言及していません。FCMPパラメータとしてハッシュオブジェクトを渡す

私はデータステップでハッシュを定義し、そのハッシュをfcmp関数への参照によって渡そうとしています。しかし、私は以下のコードを試してみると、それは私に与えている:NOTE: Invalid type conversionと私はどこに間違っているか(またはこれが可能な場合でも)わからない。

option cmplib=work.funcs; 

proc fcmp outlib=work.funcs.funcs; 
    function test(h hash); 
    return (0); 
    endsub; 
run; 


data _null_; 
    format pos best.; 

    if _n_ eq 1 then do; 
    declare hash h(); 
    rc = h.definekey('pos'); 
    rc = h.definedone(); 
    call missing (pos); 
    end; 

    xx = test2(h); 
    put _all_; 
run; 

これは、私が最終的にパラメータとして同じハッシュテーブルを渡すことができるいくつかの機能を持っているためです。

+0

一連のマクロを書くのではなく、このような状況で 'proc fcmp'を使用する特別な動機はありますか? – user667489

+0

それはとても涼しいです!私は本当にこれに興味があります。他の情報はありますか? –

+0

@StuSztukowskiここにいくつかのリンクがあります:http://support.sas.com/resources/papers/proceedings13/129-2013.pdfおよびhttp://support.sas.com/kb/47/224.html –

答えて

1

これはデータステップからは可能ではないと思います(ドキュメントリンクをご覧ください)。

しかし、fcmp関数(またはサブルーチン)内にハッシュテーブルを作成することはできますが、その後の呼び出しごとにデータステップの終わりまでそこに残ります。

異なるfcmp関数呼び出しでそのハッシュテーブルの状態を保持する必要がある場合は、ハッシュテーブルを含める汎用サブルーチンを作成し、その関数呼び出しからそのサブルーチンを呼び出します。

fcmp内のハッシュテーブルの実装は制限されています(たとえば、 'ordered'などの属性はなく、データセットにエクスポートすることはできません)。

+0

fcmp関数のハッシュテーブルは、関数が呼び出されるたびに再構築されます。大きなハッシュや関数が何度も呼び出されると無駄になる可能性があります。ジェネリックサブルーチンを作成して使用する方法の例がありますか? – Richard

+2

それは一度だけ起こります - http://support.sas.com/kb/47/224.htmlを参照してください。 –