Macros SAS:使用热键执行SAS代码

Macros SAS:使用热键执行SAS代码,macros,sas,hotkeys,shortcuts,Macros,Sas,Hotkeys,Shortcuts,我想通过SAS 9.4 for Windows中增强编辑器中的键盘快捷键执行独立于当前程序的代码。我实现这一点的成功有限,因为我只能执行宏语句。但是,我也希望能够执行非宏语句。我该怎么做 这是我到目前为止所知道的 一般设置 通过在命令提示符中输入“键”或提交,进入“键”菜单 dm 'keys'; 对于其中一个键,输入定义 %put Hello, world!; 按Ctrl+s保存新的键绑定。为了便于解释,我将把它绑定到F7。保存后,按F7,日志中将显示“你好,世界!” 我们可以通过将上述代码

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

这是我到目前为止所知道的

一般设置 通过在命令提示符中输入“键”或提交,进入“键”菜单

dm 'keys';
对于其中一个键,输入定义

%put Hello, world!;
Ctrl+s
保存新的键绑定。为了便于解释,我将把它绑定到
F7
。保存后,按F7,日志中将显示“你好,世界!”

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

%macro HelloWorld();
  %put Hello, world!;
%mend;
编译
%HelloWorld
宏。如果我们随后绑定
%HelloWorld()
F7
,我们可以演示可以使用快捷方式调用宏

通过自动调用 我们可以更进一步,将我们的
%HelloWorld
宏保存为程序
HelloWorld.sas
。如果我们随后将其放入
自动调用
库中(运行
%put%sysfunc(路径名(sasaautos));
以查找它们在您的计算机上的位置),我们可以在任何新的SAS会话中执行它

但是,似乎只有宏语句可以使用此方法。为了演示这一点,假设我们将
%HelloWorld
定义为

%macro HelloWorld();
  data _null_;
    put 'Hello, world!';
  run;
%mend;
同样,将其另存为
HelloWorld.sas
,并将其置于自动调用目录中。对我来说,当我尝试执行此操作时,会出现以下错误:

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
可以直接执行代码

创建一个名为
HelloWorld.sas
的文件,其中包含
%put Hello,world。将其保存到短文件路径。然后,在按键菜单中,将
F7
绑定到
%,包括“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.
杂项。尝试 我还尝试将代码直接输入到键定义中,但同样,它似乎只适用于宏语句


可能可以使用
%SYSFUNC
,但我的最终目标是能够使用
PROC SQL
或数据步骤,我认为
%SYSFUNC
无法做到这一点。

您可以使用submit命令,即将键定义为:

submit "data _null_ ; put 'Hello World!'; run;"
也适用于宏调用:

submit "%HelloWorld()"

您可以使用“提交”命令,即将密钥定义为:

submit "data _null_ ; put 'Hello World!'; run;"
也适用于宏调用:

submit "%HelloWorld()"

根据@Quentin的答案,如果您的datastep很大,您可以编写datastep并将其保存为编译程序,如下所示:

/* 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的建议,转到您的
窗口并输入:

submit“data pgm=work.saved_程序;描述;执行;运行;”


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

根据@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的建议,转到您的
窗口并输入:

submit“data pgm=work.saved_程序;描述;执行;运行;”


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

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