gpt4 book ai didi

statistics - Stata 对宏的行为,不同的输出

转载 作者:行者123 更新时间:2023-12-02 07:46:49 25 4
gpt4 key购买 nike

我在stata的宏中创建了一个手动列表,比如

global list1 "a b c d"

我后来用类似的东西迭代

foreach name in $list1 {
action
}

我正在尝试将其更改为数据库驱动的列表,因为该列表越来越大并且变化很快,我使用以下命令创建了一个新的 $list1

odbc load listitems=items, exec("SELECT items  from my_table")  
levelsof listitems
global list1=r(levels)

每个项目都是相同的,但这个列表似乎不同,当我有太多项目时,它会在 for 循环中中断并出现错误

{ required
r(100);

此外,当我只运行 levelsof listitems 时,我得到了输出

`"a"' `"b"' `"c"' `"d"' 

这看起来与其他宏略有不同。

我已经被困在这个问题上一段时间了。同样,它只会在项目数量变大(超过 15 个)时失败,我们将不胜感激。

最佳答案

解决方案一:

levelsof listitems, clean local(list1)
foreach name of local list1 {
...action with `name'...
}

解决方案 2:

levelsof listitems, clean
global list1 `r(levels)'
foreach name of global list1 {
...action with `name'...
}

解释:

当你输入时

foreach name in $list1 {

然后 $list1 中的任何内容都会在 Stata 看到它之前被内联替换。如果全局宏 list1 包含很长的东西列表,那么 Stata 会看到

foreach name in a b c d e .... very long list of things here ... {

更有效的方法是告诉 Stata 您在全局或局部宏中有一个事物列表,并且您想要遍历这些事物。您不必在命令行上展开它们。就是这样

foreach name of local list1 {

foreach name of global list1 {

是为了。您可以在 -help foreach- 中阅读有关 foreach 的其他功能的信息。

此外,您最初编码

levelsof listitems
global list1=r(levels)

你注意到你看到了

`"a"' `"b"' `"c"' ...

结果。这些就是 Stata 所说的“复合引用”字符串。复合引用字符串可以让您有效地嵌套引用的内容。所以,你可以有类似的东西

`"This is a string with `"another quoted string"' inside it"'

你说你不需要那个,所以你可以使用 levelsof 的“clean”选项来不引用结果。 (有关此选项的更多信息,请参阅 -help levelof-。)此外,您随后将 levelsof(在 r(levels) 中)的返回结果分配给全局宏。事实证明 -levelsof- 实际上有一个名为 -local()- 的选项,您可以在其中指定本地(非全局)宏的名称以直接将结果放入其中。因此,您只需键入

levelsof listitems, clean local(list1)

省略复合引号并将结果直接放入名为 list1 的本地宏中。

最后,如果您出于某种原因不想使用 local() 选项并想坚持将您的列表放在全局宏中,您应该编写代码

global list1 `r(levels)'

而不是

global list1=r(levels)

区别在于后者将r(levels)当作一个函数,通过Stata的字符串表达式解析器运行。在 Stata 中,字符串(字符串,不是包含字符串的宏)有 244 个字符的限制。另一方面,包含字符串的宏中可以包含数千个字符。所以,如果 r(levels) 中有超过 244 个字符,那么

global list1=r(levels)

最终会将存储在 list1 中的结果截断为 244 个字符。

当你改为编码时

global list1 `r(levels)'

然后 r(levels) 的内容在命令执行之前被内联展开。所以,Stata 看到了

global list1 a b c d e ... very long list ... x y z

宏名称 (list1) 之后的所有内容都将复制到该宏名称中,无论它有多长。

关于statistics - Stata 对宏的行为,不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com