【发布时间】:2017-07-14 01:23:37
【问题描述】:
我有一个包含以下宏变量的宏:cat_var、模型、验证。
当我输入以下调用时,宏运行良好:
%models(cat_var=mommy dadmy,model=age readhr mommy dadmy,validate=no);
但是当我进入这个电话时:
%models(cat_var=mommy dadmy,model=age readhr mommy dadmy age*readhr,validate=no);
我收到此错误消息:
在 %EVAL 函数或 %IF 条件中找到字符操作数 其中需要数字操作数。条件是:(&validate =) 或 ((&cat_var =) 和 (&model =)) 或 ((&cat_var ^=) 和 (&model =))
因此,我相信我已将问题隔离到我编写的以下代码中:
%if (&validate =) or ((&cat_var =) and (&model =)) or ((&cat_var ^=) and (&model =)) %then
%put ERROR: One or more inputs are missing. Check to make sure all macro variables have an input where necessary. (It is not necessary to have cat_var inputs);
我打算让这段代码使用的逻辑如下:
如果 validate 缺少输入或(cat_var AND 模型缺少输入)或(cat_var 不缺少输入且模型缺少输入),则显示错误消息。
在我在模型输入中输入 * 符号之前,此代码按预期工作。这是在搞砸吗?我该如何解决这个问题?
【问题讨论】:
-
if validate = or不是任何语言的有效语法。 -
是的。我意识到。它仍然不是有效的语法。
&validate作为变量不会改变它。除非or是&validate可以比较的变量(显然不是),否则比较是无效的。在我见过的任何语言中,您都无法使用等号将变量与逻辑运算符进行比较。用文字说出来。假装&validate是一只狗。 如果 Dog 等于或(Cat 或 Frog)。这对你有意义吗? -
就我的理解而言,SAS 认识到,如果等号的另一边没有参数,那么它正在评估等于 null(或缺失)的变量。如果我这样写它可能看起来更好:
(&validate=) or。但是,我已经以两种方式运行代码并且它可以工作。唯一导致它吓坏的事情是当那个 * 符号被引入时。我所要求的可能是我评估缺失输入的另一种方式,因为显然在引入 * 时出现了问题
标签: if-statement macros sas eval