【问题标题】:Stata programming language without syntax?没有语法的Stata编程语言?
【发布时间】:2011-05-10 13:54:49
【问题描述】:

我最近从程序/OO/功能背景进入 Stata,但在理解该语言的基本元素时遇到了困难。

例如,我发现有一个syntax 命令“允许程序根据语法解释用户键入的参数,例如标准Stata 语法”。我推断这就是为什么某些命令需要作为参数给出的变量列表以空格分隔而其他命令需要逗号分隔列表的原因。但是程序定义自己的语法而不是强制执行(参数)语法的想法似乎很奇怪。

另一个非常有趣的结构是宏定义和扩展的语法 (`macro') 以及明显不存在其他语言中已知的局部变量。

是否有类似“Java 开发人员的 Stata”文档向具有我背景的人解释该语言的基本概念?

PS:如果这个问题似乎不清楚,我们深表歉意。不幸的是,我现在无法提出更具体/明确的问题:(

【问题讨论】:

  • 您的问题只是“有没有好的快速入门指南”?或者您想了解语言功能吗?无论哪种情况,您可能都不需要这些编程功能,至少目前是这样。
  • @Marcin:我想了解这种语言,而不仅仅是能够将其应用于问题。是什么让你认为我不需要这些功能?我应该从使用这些功能的同事那里接管一个代码库,这就是我发现它们的方式......
  • 我认为是因为我熟悉使用此类功能的其他语言。除非您的语言非常非常时髦,否则不会有任何主动需要它们的计算。在尝试在新代码中部署这些功能之前,先学习该语言的其余部分。

标签: programming-languages language-features stata


【解决方案1】:

我不太确定您在寻找什么……但这里有一些相关的点。 Stata 有点像编写 Unix shell 脚本或 Windows 批处理文件。每行执行一个命令,第一个单词是命令名。按照惯例,大多数命令的结构如下:

command [varlist] [=exp] [if expression] [in range] [weight] [using filename] [, options]

括号 [.] 表示它是可选的(或不可用,取决于命令)。有些命令可以加前缀(例如by:xi:svy:)Stata Corp 和有经验的用户的命令语法非常一致。但是,由于 Stata 用户也会编写命令,所以您偶尔会看到一些古怪的东西。

Stata 用户编写命令时,它们保存在 .ado 文件(不是 .do)中,并使用 program 命令定义。 (请参阅help program 和手册的“Ado 文件”部分。)编写命令类似于用其他语言(例如 MatLab)编写函数

syntax 命令用于帮助您编写自己的命令。当您执行命令时,命令名称(上面的command)后面的所有内容都会传递给本地宏`0' 中的程序。语法命令解析这个本地宏,以便您可以引用`varlist'`if' 等。理论上,您可以自己解析`0',但语法命令让您和您的用户更容易(只要您遵循常规语法)。我在底部放了一个例子。

我不知道您所说的“明显不存在其他语言中已知的局部变量”是什么意思。宏在内存中存储单个字符串或单个数字。 Here's a comment 我写了关于 Stata 的本地/全局宏的文章。它们确实是 Stata 编程语言的一个独特功能。正如它们的名字所暗示的那样,“本地”宏仅在指定程序(命令)或 .do 文件中可用,而“全局”宏在整个 Stata 会话中可用。

我发现,一旦我习惯了 Stata 中的宏,我就开始怀念其他语言中的宏。它们非常方便。除了(本地/全局)宏和主数据集之外,您还可以使用scalarmatrix 命令(以及一两个其他晦涩的东西)将“事物”存储在内存中。

我希望这会有所帮助。 Here's a list resources 这可能会有所帮助。

例子:

program define myprogram
    syntax varlist [if], [hello(string) yes]
    macro list _0 _varlist _if _hello _yes 
    summarize `varlist' `if'
    display "Here's the string in my hello option: `hello'"
    if !missing("`yes'") di "Yes is on"
    else                 di "Yes is off"
end 

sysuse auto.dta    
myprogram rep78 headroom if price > 5000 , hello("world") yes

【讨论】:

  • 你成功了。这加上你在另一个问题中的回答解开了这个结。谢谢!
  • 可爱的答案!一个小问题:syntax 命令是可选的...例如,可以使用args 命令代替。
【解决方案2】:

有几本书提供了“X 为 Y 用户”的方法,但通常是在统计软件解决方案之间。关于你的问题,我建议先用直觉。

大约十年前我开始阅读(编程和标记)代码,尽管我不能用大量语言编写代码,但我可以相当轻松地阅读几种语言。我发现 Stata 很简单,因为它的大多数核心命令都很简单,带有反复出现的可选语句,如 overifreplace(采取自愿多样化的语句集),易于理解和应用。

当我教 Stata 时,我总是无法让学生像我一样使用 help 页面(而且我喜欢它们可以如此轻松地访问的事实,就像在 R 中一样)。我通过考虑我可以直接阅读语法指示这一事实来解释这个悖论。之前对您问题的回复很好地涵盖了语法。

额外的努力在于打开 utilities 文件夹中的 Stata 随附的 [R]、[U] 尤其是 [P] 手册。那里有很多细节,程序员和培训统计学家都会感兴趣。这是我学会使用宏和循环的地方,超越了local/globalforeach/while 等命令的明显逻辑(如果我理解正确的话,Stata 是图灵完备的)。

在宏循环中使用单引号/双引号时,Stata 有时会有些麻烦,但除此之外它非常简单。玩得开心!

【讨论】:

  • “我总是很难让学生像我一样使用帮助页面”这太难了!或多或少每一次讲座我试模哦!看着我查找(1)基本语法,(2)在每个帮助文件的末尾运行提供的示例,以及(3)打开示例数据集以查看特定命令的数据结构要求是什么样的. (我被教给 R 和 Stata,你的观点都适用)。最后,我说熟练使用并不意味着您记住每个命令的语法和选项,而是知道如何使用帮助。
猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2018-07-05
  • 2013-07-29
  • 2019-09-17
相关资源
最近更新 更多