请选择 进入手机版 | 继续访问电脑版
楼主: 随笔阿玛
946 5

[问答] 【求大佬翻牌】ERROR: The variable n was referenced but not given a value. [推广有奖]

  • 3关注
  • 1粉丝

本科生

69%

还不是VIP/贵宾

-

威望
0
论坛币
5760 个
通用积分
0.7500
学术水平
5 点
热心指数
5 点
信用等级
5 点
经验
849 点
帖子
10
精华
0
在线时间
200 小时
注册时间
2014-12-19
最后登录
2024-3-4

随笔阿玛 发表于 2019-12-7 14:49:24 |显示全部楼层 |坛友微信交流群
1000论坛币
我想用sas的proc ga程序步写ga-pls,在自定义函数中用run_macro()运行自定义宏函数,这样在设想中可以同时在proc ga程序步中嵌入其他模型的程序步,当然pls也是。但是,按照网上查的资料写出来的测试程序未返回相关值,提示错误:ERROR: The variable n was referenced but not given a value.ERROR: Compilation error.
ERROR: Execution terminating because of previous errors.

测试的数据集如下:
ga1        ga2        ga3        ga4        ga5
1        1        1        1        1
1        1        1        1        1
1        1        1        1        1
1        1        1        1        1
1        1        1        1        1
  1. /*导入测试数据ga*/
  2. PROC IMPORT OUT= a
  3.             DATAFILE= "C:\Users\Administrator\Desktop\ga.xlsx"
  4.             DBMS=EXCEL REPLACE;
  5.      RANGE="Sheet1$";
  6.      GETNAMES=YES;
  7.      MIXED=NO;
  8.      SCANTEXT=YES;
  9.      USEDATE=YES;
  10.      SCANTIME=YES;
  11. RUN;

  12. /*自定义的宏函数*/
  13. %macro add;
  14. data b;
  15. u=&y;
  16. run;
  17. data b(drop=u i);
  18. set b;
  19. array y[5];
  20. do i = 2 to 6;
  21. y[i-1]=substr(strip(u),i,1)+0;
  22. end;
  23. run;
  24. proc transpose data = a name = RowName1 out=d1;
  25. run;
  26. proc transpose data = b name = RowName2 out=d2;
  27. run;
  28. data c(drop=rowname1 rowname2 _label_ col1);
  29. merge d1 d2;
  30. if col1=1;
  31. run;
  32. proc transpose data = c out=d;
  33. run;
  34. data e;
  35. set d;
  36. drop _name_;
  37. run;
  38. DATA _NULL_;
  39. SET c NOBS=NOBS;
  40. CALL SYMPUTX('NUM',NOBS);
  41. RUN;
  42. data f;
  43. set e;
  44. c=sum(of col1-col&num.);
  45. n+c;
  46. run;
  47. data g(keep=n);
  48. set f nobs=nobs ;
  49. if _n_=nobs;
  50. data _null_;
  51. set g;
  52. call symputx('n', n);
  53. run;
  54. %mend;

  55. /*proc ga主体程序*/
  56. proc ga seed = 2333 maxiter = 10;
  57. function shubert(selected[*]);
  58.    array bv[5] /nosym;
  59.    call ReadMember(selected,1,bv);
  60.    y=8;
  61.    do i=1 to 5;
  62.        y=cats(y,bv[i]);
  63.    end;
  64.    re=run_macro('add',y,n);
  65.    return(n);
  66. endsub;
  67. call SetEncoding('B5');
  68. call SetObjFunc('shubert',0);
  69. call SetCrossProb(0.65);
  70. call SetCross('Uniform');
  71. call SetMutProb(0.15);
  72. call SetMut('uniform', 'pchange', 0.05);
  73. call SetSel('tournament','size', 2);
  74. call SetElite(2);
  75. call Initialize('_uniform_',20);
  76. run;
复制代码
测试的宏函数主要是求相加和最小的列变量,即最后的编码组合应是10000(五个数字只有一个是1)。
已经卡在这儿好多天了,也找不到原因,还重感冒中~求大佬翻牌!为什么会出现这个错误?以及接下来我该如何解决?

关键词:Reference Variable erence refer value
莫得那个里奇 发表于 2019-12-7 16:26:23 来自手机 |显示全部楼层 |坛友微信交流群
随笔阿玛 发表于 2019-12-7 14:49
我想用sas的proc ga程序步写ga-pls,在自定义函数中用run_macro()运行自定义宏函数,这样在设想中可以同时在 ...
谢谢分享

使用道具

popodan 在职认证  发表于 2019-12-8 10:30:37 |显示全部楼层 |坛友微信交流群
你在run proc ga之前有没有run你定义的add macro?
从你贴的code里没看到你run那个macro。而你的n的值来自于你的这个macro,如果不run的话自然就没有给n赋值。
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 精彩帖子

总评分: 论坛币 + 20   查看全部评分

使用道具

随笔阿玛 发表于 2019-12-8 17:32:00 |显示全部楼层 |坛友微信交流群
popodan 发表于 2019-12-8 10:30
你在run proc ga之前有没有run你定义的add macro?
从你贴的code里没看到你run那个macro。而你的n的值来自 ...
当然run了,这种错误我是不会犯的。。。

使用道具

popodan 在职认证  发表于 2019-12-9 06:49:34 |显示全部楼层 |坛友微信交流群
随笔阿玛 发表于 2019-12-8 17:32
当然run了,这种错误我是不会犯的。。。
那re的值是多少?macro run成功没?

使用道具

随笔阿玛 发表于 2019-12-9 19:29:05 |显示全部楼层 |坛友微信交流群
popodan 发表于 2019-12-9 06:49
那re的值是多少?macro run成功没?
re值返回不成功,会提示上述错误。将参数n去掉的话倒是能成功,re值返回0,但是也就没有意义了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 15:42