我想在Mata中执行计算,返回标量结果.然后我想在Stata的宏中访问该结果.例如,我键入:
mata: st_numscalar("dog", sum(range(1,4,1)))
然后我输入(在Stata中):
di `dog'
然后我得到(没有):
When I expected to get:
10
考虑到宏可能dog首先需要存在,我在上面的命令前加上:
scalar dog = 0
但没有骰子.
然后,认为标量是奇怪的,为什么不简单地使用一个好的旧本地:
mata: st_local("dog", sum(range(1,4,1)))
但这只会让人感到悲痛(无论是否事先创建了一个带有数值的本地名为"dog").
我错过了什么?
两个关键点:
标量是标量,宏是宏.但是标量可以有一个临时名称,这是你可能会感到困惑的地方.
宏是严格的字符串.数字标量只能包含数字.(也有字符串标量.)
. mata : st_numscalar("frog", 42)
. di frog
42
Run Code Online (Sandbox Code Playgroud)
这是一个带有永久名称的标量.但请注意:如果你有一个被称为变量的变量frog,那么这种解释将胜过scalar解释.
. tempname toad
. mata : st_numscalar("`toad'", 24)
. di `toad'
24
Run Code Online (Sandbox Code Playgroud)
这是一个带有临时名称的标量.
. mata : st_local("newt", "1000")
. di `newt'
1000
Run Code Online (Sandbox Code Playgroud)
那是一个本地宏,它保存着字符串"1000".
你可以做这样的事情.
. di `newt' + `toad'
1024
Run Code Online (Sandbox Code Playgroud)
但那是因为这里发生了两件事.Stata首先解释对本地宏和标量的引用并替换它们的内容.那么display就看了
. di 1000 + 24
Run Code Online (Sandbox Code Playgroud)
并进行计算.但是你可以坚持使用字符串解释.
. di "`newt'`toad'"
1000__000000
Run Code Online (Sandbox Code Playgroud)
这强调你必须保持某事物名称与其内容之间的差异.这里是字符串
"`toad'"
Run Code Online (Sandbox Code Playgroud)
是标量的名称,它是临时名称.
还要考虑这个:
. local anothernewt = 1000
. di `anothernewt'
1000
. di "`anothernewt'"
1000
Run Code Online (Sandbox Code Playgroud)
Stata允许您指定数字解释或字符串解释.当然,结果看起来很相似,但原则上它们是不同的.问题是这是否会咬你(不是在这个例子中).