2

我已经问过一个如何检查变量是否存在的问题。尼克考克斯回答了这个问题。然后我尝试修改答案并使用foreach循环,但它不起作用:

foreach var in var1 var2 var3 {
capture su `var', meanonly
if _rc == 0 {
local varMean = r(mean)
local varMin = r(min)
local varMax = r(max)
}
else display `var' "DOES NOT EXIST"
}

我也尝试使用of而不是in......仍然没有结果。我收到一条消息 var2 not found,它停止执行。是否capture必须前缀foreach?我试过了……没有用?

4

1 回答 1

8

这有点微妙。

鉴于var2不存在,Stata 仍被指示(在else分支机构内)

 display `var' "DOES NOT EXIST"

这将被解释为

 display var2 "DOES NOT EXIST" 

所以,它首先看到

 display var2

它倾向于解释为

 display var2[1] 

- 第一次观察中的值 - 但var2如上所述不存在,Stata 抱怨。

你想要的是显示 name var2,而不是它的内容(再一次,不存在),修复很简单

 else display "`var' DOES NOT EXIST"

双引号定界符的位置是至关重要的,以强制执行display不存在的事物的名称。不存在的事物的名称只是任意文本,Stata 对这样的文本没有问题。

简而言之,当喂给display

  "`macro'" 

是要显示的字符串,但是

 `macro' 

是要显示的变量或标量的名称,或者是具有要显示的已定义内容的宏。

顺便说一句,你的循环只是覆盖了之前存储的结果集,但大概你会在适当的时候得到它。

于 2013-06-02T19:44:12.660 回答