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