2017-07-02 42 views
0

如何複製proc fcmp中的vtype功能?錯誤:VTYPE功能僅在DATA步驟中有效

proc fcmp; 
    have=1; 
    want=vtype(have); 
quit; 

給出:

ERROR: The VTYPE function is only valid in the DATA step. User defined libraries will be searched for a definition of this function.

溶液不應涉及掃描變量的值。

我在解決這個問題的嘗試是下面:

proc fcmp; 
    function vtype2 (missval $) $; 
    if cats(missval)='.' then return ("N"); 
    else return("C"); 
    endsub; 
    have=1; 
    temp=have; 
    call missing(temp); 
    want=vtype2(temp); 
    file log; put want=; 
quit; 

我不得不用vtype2避免以下:

ERROR: Built-in SAS FUNCTION or SUBROUTINE already exists with name 'vtype'.

+0

查詢SASHELP.VCOLUMN數據集可能是最好的選擇。 – Reeza

+0

爲了什麼?沒有數據集。 –

+0

你想測試什麼?在這個程序中HAVE和TEMP被定義爲數字給定了程序的寫法。那麼創建VTYPE2()子程序的價值是什麼?您可以將結果硬編碼爲WANT,因爲它不依賴於傳遞給FCMP的任何內容。 – Tom

回答

1

不知道你所要求的。變量HAVE是你在函數中定義的東西。如果你想讓另一個變量包含一些東西來表明函數中的HAVE類型,你可以對答案進行硬編碼。

由於VTYPE()函數爲您的示例返回'N'或'C',您可以使用。

proc fcmp; 
    have=1; 
    want='N'; 
quit; 

如果你有一個複雜的鈣鎂磷肥節目裏就很難找出變量類型,你只是想要快速您可以添加到它的結束,那麼也許你可以創建一個宏,將結合VTYPE2()函數中的步驟以及您添加的步驟來生成工作所需的數據。

%macro vtype(varname,result,tempname=_vtype_&sysindex); 
&tempname=&varname; 
call missing(&tempname); 
if cats(&tempname)='.' then &result='N'; 
else &result='C'; 
%mend vtype; 

這裏是測試程序。

proc fcmp; 
    have=1; 
    %vtype(have,want) 
    if want='N' then put 'HAVE is numeric'; 
    have2='1'; 
    %vtype(have2,want2) 
    if want2='C' then put 'HAVE2 is character'; 
quit; 
+0

我試圖產生一個最小複雜度的例子。編譯時不知道變量「have」。 –

+0

您能否顯示一個變量類型未知的示例FCMP函數? – Tom

+0

不容易。這是一個非常複雜的項目.. –