无法从 SAS 中的用户定义函数中获取 return 值
Cant get return value from user defined functions in SAS
我有一个调用 SAS 宏的函数,该宏负责调用 API 并获得您的答案。这个函数是从一个步骤数据调用的,传递一个参数。
整个过程正常,只是我无法在datastep中获取响应值。
如果我单独 运行 宏,我可以将 API 响应写入日志,所以我理解应该能够 return 我的数据步骤。
有什么想法吗?
这是代码
宏
%macro acortador();
%put &url_larga;
data _null_;
length url $ 2048;
url = catt(
'http:XXXXXX',urlencode(trimn(&url_larga)));
call symputx('REQUEST_URL', url);
run;
%put &REQUEST_URL;
/* API request */
filename out "XXXXXXXX.xml";
proc http
out=out
url= "%superq(REQUEST_URL)"
method="get";
run;
/* response xml */
filename data 'XXXXXXX.xml';
data _null_;
infile data lrecl = 32000 truncover scanover;
input
@"<status>" shorturl 5. @@;
shorturl = substr(shorturl,1,index(shorturl,'</')-1);
call symputx('r', shorturl);
run;
%put &r;
%mend acortador;
函数
proc fcmp outlib=work.funcs.test;
function acortador(url_larga $) $ 300;
rc = run_macro('acortador', url_larga, r);
return (r);
endsub;
quit;
options cmplib=work.funcs;
数据步
data test;
set work.origin_table;
r = acortador(some_parameter);
run;
问题出在 RUN_MACRO 中使用的 return 变量 r。您没有为其分配长度,默认情况下 SAS 假设它是一个数字,因此您可能会得到一个 . (缺少数字)。如果你尝试让你的宏定义生成让说 %let r=1;那么您将在当前代码中获得 return 值 1。但是由于我们正在寻找获取修改后的响应字符串。所以要获得字符值,只需在 r 第一次使用之前添加 r 的长度。
length r $ 32767;
rc = run_macro('acortador', url_larga, r);
希望对您有所帮助。
我有一个调用 SAS 宏的函数,该宏负责调用 API 并获得您的答案。这个函数是从一个步骤数据调用的,传递一个参数。
整个过程正常,只是我无法在datastep中获取响应值。
如果我单独 运行 宏,我可以将 API 响应写入日志,所以我理解应该能够 return 我的数据步骤。
有什么想法吗?
这是代码
宏
%macro acortador();
%put &url_larga;
data _null_;
length url $ 2048;
url = catt(
'http:XXXXXX',urlencode(trimn(&url_larga)));
call symputx('REQUEST_URL', url);
run;
%put &REQUEST_URL;
/* API request */
filename out "XXXXXXXX.xml";
proc http
out=out
url= "%superq(REQUEST_URL)"
method="get";
run;
/* response xml */
filename data 'XXXXXXX.xml';
data _null_;
infile data lrecl = 32000 truncover scanover;
input
@"<status>" shorturl 5. @@;
shorturl = substr(shorturl,1,index(shorturl,'</')-1);
call symputx('r', shorturl);
run;
%put &r;
%mend acortador;
函数
proc fcmp outlib=work.funcs.test;
function acortador(url_larga $) $ 300;
rc = run_macro('acortador', url_larga, r);
return (r);
endsub;
quit;
options cmplib=work.funcs;
数据步
data test;
set work.origin_table;
r = acortador(some_parameter);
run;
问题出在 RUN_MACRO 中使用的 return 变量 r。您没有为其分配长度,默认情况下 SAS 假设它是一个数字,因此您可能会得到一个 . (缺少数字)。如果你尝试让你的宏定义生成让说 %let r=1;那么您将在当前代码中获得 return 值 1。但是由于我们正在寻找获取修改后的响应字符串。所以要获得字符值,只需在 r 第一次使用之前添加 r 的长度。
length r $ 32767;
rc = run_macro('acortador', url_larga, r);
希望对您有所帮助。