0

既存の変数にフォーマットを割り当てて、新しい変数を作成しようとしています。私はマクロ内からこれを行っています。次のエラーが表示されます: ": フォーマット名が必要です。" 解決方法について何か考えはありますか?ありがとう!

/* macro to loop thru a list of vars and execute a code block on each. This is working     fine. */ 
%macro iterlist  
( 
  code =  
 ,list = 
) 
;  
  %*** ASSIGN EACH ITEM IN THE LIST TO AN INDEXED MACRO VARIABLE &&ITEM&I ; 
  %let i = 1; 
  %do %while (%cmpres(%scan(&list., &i.)) ne ); 
    %let item&i. = %cmpres(%scan(&list., &i.));  
    %let i = %eval((&i. + 1);  
  %end; 
  %*** STORE THE COUNT OF THE NUMBER OF ITEMS IN A MACRO VARIABLE: &CNTITEM; 
  %let cntitem = %eval((&i. - 1); 

  %*** EXPRESS CODE, REPLACING TOKENS WITH ELEMENTS OF THE LIST, IN SEQUENCE; 
  %do i = 1 %to &cntitem.;                                        
    %let codeprp = %qsysfunc(tranwrd(&code.,?,%nrstr(&&item&i..))); 
    %unquote(&codeprp.) 
  %end;  
%mend  iterlist; 


/* set the list of variables to iterate thru  */ 
%let mylist = v1 v2 v3 v4; 


 /* create a contents table to look up format info to assign in macro below*/ 
proc contents data=a.recode1 noprint out=contents; 
run; 




/* macro to create freq and chisq tables for each var */ 

%macro runfreqs (variabl = );
proc freq data=a.recode1 noprint ; 
    tables &variabl.*improved /out=&variabl._1 chisq; 
    output out=&variabl.chisq n pchi  ;
run;  



    /* do some more stuff with the freq tables, then grab format for variable from contents */ 
data _null_; 
    set contents; 
    if name="&variabl." then CALL SYMPUT("classformat", format); 

run; 

data &variabl._3; 
length classvalue $ 30 ; 
    set &variabl._2; ; 

            /* output a new var using the macro variable for format that we pulled from contents above. Here's where the error occurs.  */ 
    classvalue=put(class, %quote(&classformat.));  


run; 




%mend  runfreqs; 


* run the macro, iterating thru var list and creating freq tables; 
%ITERLIST(list = &mylist., code = %nrstr(%runfreqs(variabl = ?);)); 
4

2 に答える 2

1

推測するに、ライン

classvalue=put(class, %quote(&classformat.));

する必要があります

classvalue=put(class, &classformat..); 

2 つのポイントは、1 つはマクロ変数名の終わりを示すためにマクロ プロセッサによって「食べられる」ため、もう 1 つはフォーマット名を完成させるために必要です。あなたの場合は必要ないと思い%quote()ます-フォーマット名には、で引用された文字列を含めることはできません%quote()

編集:もう一度試してみませんでした。コードに基づいて、変更CALL SYMPUT("classformat", format); する必要もありますCALL SYMPUTX("classformat", format);

CALL SYMPUTX() は CALL SYMPUT() の高度なバージョンであり、元のバージョンでは空白が保持されますが、マクロ変数値の末尾の空白が削除されます。事実上、これはソリューションと同じになりますが、より単純になります。したがって、問題は実際にはフォーマット名とピリオドの間に余分な空白があることです。

于 2013-01-29T09:56:04.803 に答える
0

なぜこれが機能し、vasja のアイデアが機能しないのかはわかりませんが、問題は明らかに形式名の末尾のピリオド (または余分な空白?) にありました。データ ステップを変更して、SYMPUT 呼び出しの前にピリオドを追加しました。

data _null_; 
set contents; 
myformat=catt(format,'.'); 
if name="&variabl." then CALL SYMPUT("classformat", myformat); 
run; 
于 2013-01-29T15:56:18.957 に答える