楼主: dxystata
31770 8

[编程问题求助] local定义内容在命令中的问题 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2014-5-1 22:21:50 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. program drop _all
  2. program define abc
  3. syntax [varlist],[aaa(string)]
  4.         di "`aaa'"
  5. end

  6. local aaa "ddd"
  7. abc,aaa("`aaa'")
复制代码



思路如下:
1. 通过local 定义aaa
2. 在定义的命令中显示aaa的内容
有没办法做到只运行abc,aaa或abc就能把aaa的值显示出来




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Local OCA Program varlist SYNTAX local

本帖被以下文库推荐

沙发
dxystata 发表于 2014-5-1 22:26:19
local是在命令运行前定义的

藤椅
dxystata 发表于 2014-5-1 22:32:20
  1. program drop _all
  2. program define abc
  3. syntax [varlist],
  4.         di "`aaa'"
  5. end

  6. local aaa "ddd"
  7. abc
复制代码

local 定义的内容无法在命令中显示。

板凳
╰不滅信念 学生认证  发表于 2014-5-2 10:24:29
为了了解local、global等暂元在程序内部的运作原理,做如下实验:
  1. local l_1 "local_a"
  2. global g_1 "global_a"
复制代码
定义两个变量,一个是所谓的“本地”,一个是“全局”,利用
  1. macro list
复制代码
显示程序中所有宏变量:
01_define.jpg



接着定义程序:
  1. capture program drop fun_1
  2. program fun_1
  3.         display "g_1= ""$g_1"
  4.         display "l_1= ""`l_1'"
  5. end
复制代码
很简单,把全局的、本地的都给我显示出来:
之后在程序中定义此program并运行:
02_output_1.jpg
发现全局的没问题,本地的却没显示!

回到上面一张图,发现全局的、本地的变量名称是不一样的,本地的前面其实是有一个“_”的,更改程序如下:
  1. capture program drop fun_2
  2. program fun_2
  3.         display "g_1= ""$g_1"
  4.         display "l_1= ""`_l_1'"
  5. end
复制代码
运行:
03_output_2.jpg

还是一样。。故得出结论:程序中的local变量是访问不到的,除非是global变量。
这个也很容易理解,如果学过对象编程,就可以把程序中的local变量看成是私有变量,其他程序是访问不到的,只有程序层能访问到,而global为全局变量,所为全局就是大家都能访问到,程序也是可以的
对此,作出另一组实验:
  1. capture program drop fun_3
  2. program fun_3
  3.         local ll_1  "ll_1"
  4.         global gg_1 "gg_1"
  5.         display "gg_1= ""$gg_1"
  6.         display "ll_1= ""`ll_1'"
  7. end
复制代码
截图:
04_output_3.jpg
输出是达到预期的,而且在后面的macro list中可以看到全局变量多了一个gg_1,而本地变量ll_1是没有增加的。
已有 1 人评分论坛币 热心指数 收起 理由
dxystata + 40 + 1 分析的有道理

总评分: 论坛币 + 40  热心指数 + 1   查看全部评分

where there is a will there is a way

报纸
dxystata 发表于 2014-5-2 12:16:22
我的程序中用的是global,但我希望用local实现,故发个帖子看看高手能不能实现!

地板
sungmoo 发表于 2014-5-3 07:14:52
dxystata 发表于 2014-5-2 12:16
我的程序中用的是global,但我希望用local实现,故发个帖子看看高手能不能实现!
这里涉及到Stata对“局部”与“全局”的理解。local定义的macro的含义,要看它是在哪个“程序范围”内定义的,其内容只在该范围内有效。同名的macro,可以在不同的“程序范围”内分别定义(分别有自己的内容,而不“冲突”——个人以为,表面上可以同名,实际上不会是真正的同名)。
loc a abcd
ma l
di "a=`a'"
cap pr drop fun
pr fun
loc a rel
n di "a=`a'"
n ma l
end
fun
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

7
sungmoo 发表于 2014-5-3 07:34:50
ma l可用于显示“已定义”的macro的内容。
(在既定的“程序范围内”)
ma l a:显示最近一次"gl a…"所定义的内容。
ma l _a:显示最近一次"loc a…"所定义的内容。

***
这里还需要注意:Stata的设计是,并不是真正“新建”或“删除”某个macro。Stata默认任意名的macro的内容都是“一无所有”。gl或loc其实只是更改了某macro的默认值(或已有值)。

gl a
loc a
这两条命令其实只是把a的内容还原成(最初的)默认值“一无所有”,表观上好像删除了a。

ma di或ma l其实只是显示了其内容非“一无所有”的macros的内容(只有这样,才可能显示有限个macros的内容)。这两条命令会视其内容为“一无所有”的macros是“不存在的”。

8
dxystata 发表于 2014-5-3 08:47:40
sungmoo 发表于 2014-5-3 07:14
这里涉及到Stata对“局部”与“全局”的理解。local定义的macro的含义,要看它是在哪个“程序范围”内定义 ...
我的意思是loc a abcd
`a'在fun程序中可以使用

9
sungmoo 发表于 2014-5-3 15:47:50
dxystata 发表于 2014-5-3 08:47
我的意思是loc a abcd
`a'在fun程序中可以使用
我明白你的意思。之前的帖子里对“局部”的意义已经做了说明(loc命令的定义要在既定程序范围内,不同范围内可以有同名macros)。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 11:34