Stata:dofile文件规整神器-lint

发布时间:2023-04-27 阅读 734

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:郭盼亭 (厦门大学)
邮箱gpting2020@163.com


目录


1. 引言

不知道你在刚开始写代码的时候,是否遇见过以下情况:不确定自己写的对不对?又或者运行的时候总是报错?又或者是写出来的格式总是没有别人写的好看?是否希望有一款自动纠错的工具?

stata_linter 或许可以帮助你!该软件包是一种主观的检测工具,该命令是根据世界银行开发影响评估部门的良好编码实践编写的,旨在改善 Stata 的 do 文件的可读性和组织性。

在 Stata 中可以通过 lint 命令来实现两个功能:

  • 检测功能 (Detection) 可以识别 Stata 的 do-files 中的写的不良编码。
  • 纠正功能 (Correction) 用于纠正 Stata 的 do-file 中的错误编码。

2. 命令介绍

命令安装:

ssc install stata_linter, replace 

需要注意的是,要运行此命令,使用者需要安装 Stata16 版本或更高版本、Python 和 Python 的 Pandas 包。

命令语法:

lint "input_file" [using "output_file"] , [options]
  • 如果使用 using 指定了 output_file,那么 linter 将应用纠正功能 (Correction),将更正后的代码写入指定的 output_file
  • 如果没有指定 output_file,该命令将只执行检测功能 (Detection),在 Stata 的 Results 窗口中返回更正的建议和 do 文件的潜在问题的报告。
  • 另外需要注意的是,并不是所有在 Detection 中发现的不良代码都可以通过纠正功能 (Correction) 进行修正。

其中,options 如下:

  • verbose:报告每行 do-file 中发现的不良实践和问题。
  • nosummary:禁止生成不良实践和潜在问题的总结表。
  • indent(integer):检查缩进编码实践时使用的空格数 (默认值为 4)。
  • space(integer):检查缩进实践时使用的空格数而非硬制表符 (默认值:与缩进值相同)。
  • linemax(integer):检查行扩展实践时一行中的最大字符数 (默认值为 80)。
  • excel(filename):将逐行结果保存为 Excel 文件。
  • force:允许输出文件名与输入文件名相同,覆盖原始 do-file。不建议使用此选项,因为命令创建的纠正后的 do-file 可能会破坏代码的某些部分,使用者应该始终保留其原始代码备份。
  • automatic:自动纠正所有不良编码实践,无需询问是否要纠正每个不良编码实践。默认情况下,命令会在生成总结报告后交互式地询问用户每个纠正。
  • replace :覆盖任何现有的输出文件。

3. 基本用法介绍

3.1 检测

. lint "test/bad.do"
* 在您的 Stata 控制台上,您将获得代码中发现的不良编码实践的摘要:
---------------------------------------------------------
Bad practice                                 Occurrences                   
---------------------------------------------------------
Hard tabs used instead of soft tabs:                 Yes       
One-letter local name in for-loop:                   3
Non-standard indentation in { } code block:          7
No indentation on line following ///:                1
Missing whitespaces around operators:                0
Implicit logic in if-condition:                      1
Delimiter changed:                                   1
Working directory changed:                           0
Lines too long:                                      5
Global macro reference without { }:                  0
Use of . where missing() is appropriate:             6
Backslash detected in potential file path:           0
Tilde (~) used instead of bang (!) in expression:    5
--------------------------------------------------------

如果要获取出现这些不良编码实践的行,可以使用选项,例如 verbose

. lint "test/bad.do", verbose

在命令的常规输出之前提供以下信息:

(line 14): Use 4 white spaces instead of tabs. (This may apply to other lines as well.)
(line 15): Avoid to use "delimit". For line breaks, use "///" instead.
(line 17): This line is too long (82 characters). Use "///" for line breaks so that one line has at m
> ost 80 characters.
(line 25): After declaring for loop statement or if-else statement, add indentation (4 whitespaces).
(line 25): Always explicitly specify the condition in the if statement. (For example, declare "if var
>  == 1" instead of "if var".)
...

3.2 更正

如果要更正 do-file 中的不良做法,可以运行以下命令:

. lint "test/bad.do" using "test/bad_corrected.do"   

在这种情况下,lint 命令将创建一个名为 的 do 文件。Stata 会询问您是否要对检测到的每个不良做法逐个执行一组更正。您可以添加自动执行更正的选项,并跳过手动确认。强烈建议输出文件与输入文件具有不同的名称,因为原始 do 文件应保留为备份。

作为此命令的结果,一段 Stata 代码如下所示:

#delimit ;
foreach something in something something something something something something
  something something{ ; // some comment
  do something ;
} ;
#delimit cr

成为:

foreach something in something something something something something something ///
  something something {  // some comment
  do something  
}

if something ~= 1 & something != . {
do something
if another == 1 {
do that
}
}

成为

if something ~= 1 & something != . {
  do something
  if another == 1 {
      do that
  }
}

3.3 其他选项

检测功能相关的选项:

  • verbose:显示出现不良做法的所有行。
  • nosummary:禁止显示不良做法的摘要。
  • excel():将检测结果导出到 Excel。

校正功能独有的选项:

  • automatic:更正所有不良编码实践,而不询问是否希望纠正检测到的每个不良编码实践。
  • replace:替换现有输出文件。
  • force:允许输出文件名与输入文件名相同 (不推荐)。

这两个功能的选项:

  • indent():指定用于缩进的空格数 (默认值为 4)。
  • linemax():一行中的最大字符数 (默认值为 80)。
  • tab_space():使用的空格数而不是硬制表符 (默认值为 4)。

3.4 要检测的编码实践

使用软制表符 (即空格),而不是硬制表符:使用空格 (通常使用 2 或 4 个空格) 而不是硬制表符。您可以在 do-file 编辑器首选项中更改此选项。

避免使用抽象索引名称:在 for 循环中,索引名称应描述代码循环的内容。因此,避免像这样编码:

foreach i of var cassava maize wheat { }

相反,循环命令应以描述性方式在本地命名索引:

foreach crop of var cassava maize wheat { }

使用正确的缩进:声明 for 循环语句或 if-else 语句后,添加带有空格 (通常为 2 或 4 个空格) 的缩进。

声明换行符后使用缩进 ///:在新行语句后,添加缩进 (通常为 2 或 4 个空格)。

使用 !missing() 函数表示缺失值:为清楚起见,请使用 !missing(var) 表示缺失值,而不是 var < . var != .

在数学符号 (+=<>) 周围添加空格:为了提高可读性,请在数学符号周围添加空格。例如,用 gen a = b + c if d == e 代替 gen a=b+c if d==e

if 语句中指定条件:始终在 if 语句中显式指定条件。例如,声明 if var == 1 而不是 if var

不要使用 delimit 作为分隔符,而应使用 /// 作为换行符:有关使用换行符的详细信息,请参阅此处

不要使用 cd 命令更改当前文件夹:使用绝对和动态文件路径。

对过长的行使用换行符 ///:对于太长的行,请使用换行符并将它们分成多行。建议将一行中的字符数限制在 80 以内。虽然有时这很困难,因为例如,Stata 不允许双引号内的分隔符,请尽可能遵循此规则。

对全局宏使用大括号:始终用于全局宏。例如,使用 ${ } ${global} 代替 $global

在条件表达式中包含缺失值:条件表达式可能对于缺失值被计算为 true。确保通过在表达式中使用来显式考虑缺失值。var != 0 var > 0 missing()

检查文件路径中是否未使用反斜杠:检查文件路径中是否使用反斜杠(\)。如果您正在使用它们,请将它们替换为正斜杠(/)

检查波浪号 (~) 是否不用于否定:如果使用波浪号进行否定,请将其替换为 (!) 符号。

3.5 需要纠正的编码实践

该功能不会更正检测到的所有不良做法。 它仅更正以下内容:

  • 将需要换行的地方使用 delimit 替换为///
  • 将硬制表符替换为软空格 (默认为 4)。可以使用选项设置空间量 tab_space()
  • 默认情况下,缩进大括号内的行有 4 个空格。可以使用选项设置空间量 indent()
  • 将长行分成两行。默认情况下,长行被视为超过 80 个字符,但可以使用该选项linemax()
  • 在打开大括号之前添加空格,全局变量除外。
  • 在右大括号后删除多余的空白行。
  • 删除重复的空白行。

如果省略该选项,将提示用户确认他们是否要在检测到这些不良做法时才更正这些不良做法。如果未检测到这些,它将显示以下消息:

Nothing to correct.
The issues lint is able to correct are not present in your dofile.
No output files were generated.

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 代码 规范, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh