查看原文
其他

一个粉丝的疑惑—— local和scalar

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈志玲

文字编辑:朱巧利

技术总编:李朋冲


在Stata中,我们需要经常使用到local和scalar,其中前者用来定义局部宏,后者用来定义标量,那么这两个命令究竟有什么区别呢?最近,一位读者为我们发来了一段同时使用local和scalar的程序,但是出现报错,我们来一起看看~


程序如下:

sysuse auto, clear // 清空内存,读入auto数据集count if foreign // 计数scalar nobs = r(N) //将返回值赋给标量nobslocal n1 nobs //将nobs以字符串形式存储在局部宏n1forvalues v=11(11)`n1' { //起始值为11,步长为11,尾数为局部宏n1,进行循环输出 display "`v'"}


我们运行了一下,程序报错如下:



报错信息显示语法错误。这是因为在forvalues循环中,我们定义的步长和起始位置均为数值型,那么终止位置`n1’也应为数值。但是,在循环之前我们定义的局部宏n1,是将字符串nobs存入其中。



因此,只要`n1’放入的数据类型是数值型,问题就得以解决,我们提供的方案如下:


  • 定义一个局部宏n2= nobs:

sysuse auto, clearcount if foreignscalar nobs = r(N)local n2 = nobsforvalues v=11(11)`n2' { //将标量nobs的值赋给n2,此时局部宏n2为22display "`v'"}


  • 直接使用局部宏`=nobs’,即:

sysuse auto, clearcount if foreignscalar nobs = r(N)forvalues v=11(11)`= nobs' { //直接使用局部宏= nobsdisplay "`v'"}


  • 定义一个局部宏n3= r(N):

sysuse auto, clearcount if foreignlocal n3 = r(N)forvalues v=11(11)`n3' { //直接将返回值赋给局部宏n3,不使用标量display "`v'"}


以上三种方案的运行结果均为:



这样我们就解决了读者的问题,那么接下来,我们来总结一下local和scalar的一些不同。
 
第一,如上述程序所示,在使用local命令定义局部宏时,需要使用`’ ,scalar则不需要。在大多数键盘上,左引号位于左上方“波浪号”下面,右引号位于中间位置的“双引号”的下面,如下图箭头所示:



第二,local和scalar中都可以放入数值和字符串。此外,local还可以存放一个命令,但scalar不行。下面举一个用local定义命令的例子:



但当我们用scalar定义命令时,会报错:



第三,scalar可以保留任意长度字符串,甚至比local要长。同时,scalar可以保存二进制数据,运行起来比local要加精确和迅速。这是因为local需要把内容转换为内部二进制表达式,再把二进制转换为宏的内容,在转换过程中可能会损失时间和精度。
 
在了解上述不同之后,大家可能会疑惑,二者孰优孰劣?其实我们可以看到它们都存在各自的优势和缺点。比如,在使用范围方面,local的使用范围更广。更加通俗的说,就是local可以做scalar能做的,但local能做的scalar未必能做。而在储存数值型数据方面,scalar则比local更准确,运行速度也比较快。大家在使用时,“对症下药”即可~

 


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

新的一年,效率满满~(下)

自科基金项目信息爬取

rename group批量修改变量名

小命令,大不同——insobs插入新值

新的一年,效率满满~(上)

圆蛋快乐
BvD最后一弹——宏观数据宝典
一招搞定并购数据
多图“预警”(二)

您的圣诞礼物到了,请注意查收

BvD数据库介绍之Oriana

frlink:让连接更具“目的性”

多图“预警”(一)

Selenium的等待方式
一举拿下函数图像
BvD数据库介绍之Osiris
来!左边跟我一起画个龙在你右边画一道彩虹~

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存