Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 错误:VTYPE函数仅在数据步骤中有效_Sas - Fatal编程技术网

Sas 错误:VTYPE函数仅在数据步骤中有效

Sas 错误:VTYPE函数仅在数据步骤中有效,sas,Sas,如何在proc fcmp中复制vtype函数 给出: 错误:VTYPE函数仅在数据步骤中有效。使用者 将在已定义的库中搜索此函数的定义 解决方案不应涉及扫描变量值 我解决这个问题的尝试如下: proc fcmp; function vtype2 (missval $) $; if cats(missval)='.' then return ("N"); else return("C"); endsub; have=1; temp=have; call mi

如何在proc fcmp中复制vtype函数

给出:

错误:VTYPE函数仅在数据步骤中有效。使用者 将在已定义的库中搜索此函数的定义

解决方案不应涉及扫描变量值

我解决这个问题的尝试如下:

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来避免以下情况:

错误:名为的内置SAS函数或子例程已存在 “vtype”


不知道你要什么。变量HAVE是您在函数中定义的内容。如果您想创建另一个变量,该变量包含指示函数中HAVE类型的内容,您可以对答案进行硬编码

由于VTYPE函数在示例中返回“N”或“C”,因此您将使用

proc fcmp;  
  have=1;
  want='N';
quit;
如果您有一个复杂的FCMP程序,其中很难找出变量类型,并且您只想快速添加一些内容,然后您可以创建一个宏,将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;

查询SASHELP.VCOLUMN数据集可能是最好的选择。为什么?没有数据集。您要测试什么?在这个程序中,HAVE和TEMP都被定义为数字,给出了程序的编写方式。那么,创建VTYPE2子例程的价值是什么呢?您可以为WANT硬编码结果,因为它不依赖于传递给FCMP的任何内容。可以是字符或数字,有必要在运行时动态确定变量类型,以便应用适当的条件逻辑。在这个程序中,除了数字之外,怎么可能有其他内容?你能创建一个在代码编写时不知道HAVE类型的程序吗。变量have在编译时未知..能否显示一个变量类型未知的示例FCMP函数?向上投票,但必须有一种方法按照我的vtype2尝试将此逻辑添加到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;