我需要一个st_numscalar()示例

时间:2014-04-04 06:54:08

标签: stata

我想在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"数字值的本地人)。

我错过了什么?

1 个答案:

答案 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允许您指定数字解释或字符串解释。当然,结果看起来很相似,但原则上它们是不同的。问题是这是否会咬你(不是在这个例子中)。