SAS:使用热键执行 SAS 代码

Posted

技术标签:

【中文标题】SAS:使用热键执行 SAS 代码【英文标题】:SAS: Execute SAS code using hotkey 【发布时间】:2017-08-08 01:25:33 【问题描述】:

我想通过 SAS 9.4 for Windows 的增强编辑器中的键盘快捷键执行独立于我当前程序的代码。我已经以有限的成功实现了这一点,只能执行宏语句。但是,我也希望能够执行非宏语句。我该怎么做?

这是我目前为止的想法。

常规设置

通过在命令提示符中输入“KEYS”或提交进入 KEYS 菜单

dm 'keys';

对于其中一个键,输入定义

%put Hello, world!;

Ctrl+s 保存新的键绑定。为了解释的目的,我将它绑定到F7。保存后,按F7 和“你好,世界!”将打印到日志中。

我们可以通过将上述代码放在宏中来进一步扩展这个概念。

%macro HelloWorld();
  %put Hello, world!;
%mend;

编译%HelloWorld 宏。如果我们然后将%HelloWorld(); 绑定到F7,我们可以证明可以使用快捷方式调用宏。

通过自动调用

我们可以更进一步,将我们的%HelloWorld 宏保存为程序HelloWorld.sas。如果我们然后将其放入AUTOCALL 库中(运行%put %sysfunc(pathname(sasautos)); 以查找它们在您的计算机上的位置),我们可以在任何新的 SAS 会话中执行它。

但是,似乎只有宏语句才能使用此方法。为了证明这一点,假设我们将%HelloWorld 定义为

%macro HelloWorld();
  data _null_;
    put 'Hello, world!';
  run;
%mend;

同样,将其保存为HelloWorld.sas 并将其放置在 AUTOCALL 目录中。对我来说,当我尝试执行此操作时,出现以下错误:

ERROR: The SAS/EIS product with which the procedure is associated is either not licensed for
       your system or the product license has expired. Please contact your SAS installation
       representative.

通过 %INCLUDE

由于 AUTOCALL 需要编译和调用宏,我认为%INCLUDE 可能会直接执行代码。

创建一个名为HelloWorld.sas 的文件,其中包含%put Hello, world!。将其保存到短文件路径。然后,在 KEYS 菜单中将 F7 绑定到 %include "C:\Short Path\HelloWorld.sas";。现在F7 将打印“你好,世界!”到日志。

如果我们改为保存

data _null_;
  put 'Hello, world!';
run;

HelloWorld.sas 并尝试使用我们的%INCLUDE 快捷方式运行它,我收到同样的错误:

ERROR: The SAS/EIS product with which the procedure is associated is either not licensed for
       your system or the product license has expired. Please contact your SAS installation
       representative.

杂项。尝试

我也尝试将代码直接输入到 KEYS 定义中,但同样,它似乎只适用于宏语句。

也许可以使用%SYSFUNC,但我的最终目标是能够使用PROC SQL 或数据步骤,我认为%SYSFUNC 做不到。

【问题讨论】:

嗨 - 这很有趣,但我在这里没有看到问题。 还有什么不清楚的地方?它当然显示了研究并且很有用。如果不了解解决方案有多大用处,让我解释一下。在增强编辑器中,您可以创建键盘宏,但允许的操作仅限于 SAS 证明的固定列表。但是,如果可以按照问题中描述的方式执行独立于当前程序的 SAS 代码,那么可以以以前不可能的方式修改编辑器。编辑器将获得脚本功能。 不清楚的是问题部分。你花了很多时间来展示你所做的事情,这是值得赞赏的,但你在第一段中并没有足够的时间来成为一个明确的问题,至少对我来说是这样。你想执行什么样的代码?原因/应用是什么?这些事情适用于潜在的答案。 (顺便说一句,这是一个覆盖得相当好的空间,一旦你把它缩小一点。)你是否试图将实用程序宏放在那里,比如你想要一个“创建格式”按钮和一个“定义一个格式”按钮哈希表”? (cont) 或者您是否正在尝试自动设置您的库名称,或对数据集进行排序,或执行任意数量的其他任意操作。或者您是否还有一些特定的项目特定的事情想要做(例如下载您的数据)?这些用途中的每一种都有可能不同的答案。 我正在尝试做任意数量的任意事情。理想的脚本编写能力不会受到特定任务的限制。虽然我确实有一个特定的任务,但它似乎(也许很天真)应该独立于执行执行所述任务的代码所涉及的过程。我知道,SAS 并不总是可以实现这样的理想。你提到“这是一个覆盖得相当好的空间”。你的意思是关于使用脚本来增强编辑器吗?如果是这样,你能分享这些资源吗?我已经对此进行了广泛的研究,但只提出了一些建议。 【参考方案1】:

您可以使用提交命令,即将key定义为:

submit "data _null_ ; put 'Hello World!'; run;"

也适用于宏调用:

submit "%HelloWorld()"

【讨论】:

【参考方案2】:

基于@Quentin 的回答,如果您的数据步很大,您可以编写数据步并将其保存为已编译的程序:

/* store your datastep (below stored in WORK, can be stored in any defined library */
data male female / pgm=work.saved_program;
    set sashelp.class;
    if SEX="M" then output male;
        else output female; 
run;

然后按照@Quentin 的建议,转到您的KEYS<DMKEYS> 窗口并输入:

submit "data pgm = work.saved_program; describe; execute; run;"

这将提交保存在您选择的任何库中的整个数据步骤。

【讨论】:

以上是关于SAS:使用热键执行 SAS 代码的主要内容,如果未能解决你的问题,请参考以下文章

SAS 程序冷知识——如何在启动sas程序时自动执行一些宏?

sas如何写赋值循环

使用文件中的代码作为 SAS 宏变量的内容

SAS Compress函数返回FALSE值

SAS:用所有数据绘制预测数据

如何为与正在执行的 SAS 脚本名称相似的输出文件命名?