在SAS用户定义函数中使用变量

在SAS用户定义函数中使用变量,sas,Sas,我是一个初学者SAS用户,在VBA方面有很多经验,我很难理解SAS中的用户定义函数 我在用户定义函数中使用变量时遇到了一些问题,但我认为下面列出的两个问题可能是相关问题,可能会解决其余问题 一) 如何从用户定义的函数中使用宏函数中的变量 proc fcmp outlib = sasuser.funcs.trial; function testNumbers(testvar $) $; length testing $ 100; lencheck = %le

我是一个初学者SAS用户,在VBA方面有很多经验,我很难理解SAS中的用户定义函数

我在用户定义函数中使用变量时遇到了一些问题,但我认为下面列出的两个问题可能是相关问题,可能会解决其余问题

一) 如何从用户定义的函数中使用宏函数中的变量

proc fcmp outlib = sasuser.funcs.trial;
    function testNumbers(testvar $) $;
        length testing $ 100;
        lencheck = %length(testvar);
        return (lencheck);
    endsub;
run;
options cmplib = sasuser.funcs;
%put %sysfunc(testnumbers(short));
 proc fcmp outlib=sasuser.funcs.trial;
     function testNumbers(testvar $) $;
           length testvar $ 100;
           myNumber = 5
           testNum = put(myNumber, 2.);

           tempPath = %substr(1234567890, 3, 2)
           tempPath1 = %substr(1234567890, 3, myNumber)
           tempPath2 = %substr(1234567890, 3, testNum)
           tempPath3 = %substr(1234567890, 3, put(myNumber, 2.))

           return (tempPath);
     endsub;
 run;
无论函数的输入是什么,结果总是7,这与输入变量名“testvar”的长度相匹配。如果我更改变量名,它将更改结果。我试着在变量名前面加上一个符号,但这不起作用(它只会使结果变成8…)。我可以通过输入“return(testvar)”来获得返回输入的函数,但是我不知道如何让length函数工作

二) 如何在用户定义函数的上下文中将变量定义为数字

proc fcmp outlib = sasuser.funcs.trial;
    function testNumbers(testvar $) $;
        length testing $ 100;
        lencheck = %length(testvar);
        return (lencheck);
    endsub;
run;
options cmplib = sasuser.funcs;
%put %sysfunc(testnumbers(short));
 proc fcmp outlib=sasuser.funcs.trial;
     function testNumbers(testvar $) $;
           length testvar $ 100;
           myNumber = 5
           testNum = put(myNumber, 2.);

           tempPath = %substr(1234567890, 3, 2)
           tempPath1 = %substr(1234567890, 3, myNumber)
           tempPath2 = %substr(1234567890, 3, testNum)
           tempPath3 = %substr(1234567890, 3, put(myNumber, 2.))

           return (tempPath);
     endsub;
 run;
第一个tempPath工作并按预期返回“34”。但是tempPath1、tempPath2和tempPath3都返回错误。错误在于宏函数%substr的参数3不是数字。对于tempPath3,还有一个额外的错误,即在表达式中找不到所需的运算符

注意:我知道这些函数没有做任何有价值的事情。这些都被简化了,因为我正在努力学习语言和可能性。即使提供了简单的代码,也可能存在其他问题,如果您对此有任何建议,我们将不胜感激


我实际上试图编写的是一个函数,它允许动态更改正在使用的库(因此,如果设置了临时标志,所有内容都将进入工作目录,如果没有,则将进入最终生产位置)。如果有比UDF更好的解决方案,我也很想听听这个。

宏处理器在将结果传递到基本SAS进行处理之前进行计算

因为你的程序使用这个宏逻辑

lencheck = %length(testvar);
宏处理器将计算长度为7的
%length(testvar)
,因为这是字符串
testvar
中的字符数。这与写这句话的意思相同:

lencheck = 7 ;
如果希望函数查找变量
TESTVAR
的长度,则需要使用
length()
函数,而不是宏函数
%length()


在第二个示例中,使用
%SUBSTR()
宏函数而不是函数
SUBSTR()
,您也遇到了类似的问题。

我觉得自己在做一些愚蠢的事情。感谢您对处理顺序和分辨率的清晰解释@OpiesDad实际-使用
lengthn()
函数。
length()
函数为空字符串返回值1
lengthn()
将返回预期值零。您可能还需要查看
substrn()
函数。@RobertPenridge谢谢!对于我目前正在编写的特定函数,这并不重要,但这肯定会在以后不可避免地会带来麻烦时避免一大堆麻烦。:)