我需要一个st_numscalar()示例

Ale*_*xis 1 stata

我想在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").

我错过了什么?

Nic*_*Cox 6

两个关键点:

标量是标量,宏是宏.但是标量可以有一个临时名称,这是你可能会感到困惑的地方.

宏是严格的字符串.数字标量只能包含数字.(也有字符串标量.)

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

  • 已经解释过了。请再次阅读答案。`display` 理解 `di 13 * 3` 意味着你想要一个数字计算。`display` 永远不会看到本地宏,只会看到它的内容,因为 Stata 在任何特定命令开始工作之前解释所有宏引用。 (2认同)