Loops 检查变量';使用Stata存在

Loops 检查变量';使用Stata存在,loops,capture,stata,Loops,Capture,Stata,我已经问过如何检查变量的存在。尼克·考克斯回答了。然后我尝试修改答案并使用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" } 我也试着用的代替中的…仍然没

我已经问过如何检查变量的存在。尼克·考克斯回答了。然后我尝试修改答案并使用
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"
}

我也试着用的
代替
中的
…仍然没有结果。我收到一条消息
var2未找到
,它停止执行。
capture
是否必须在
foreach
前面加前缀?我试过了……没用?

这有点微妙

鉴于
var2
不存在,Stata仍被指示(在
else
分支中)执行以下操作:

这可以解释为

 display var2 "DOES NOT EXIST" 
所以,它首先看到

 display var2
它倾向于解释为

 display var2[1] 
--第一次观察中的值——但正如所说的
var2
不存在,Stata抱怨道

您想要显示的是名称
var2
,而不是它的内容(同样,它也不存在),并且修复程序非常简单

 else display "`var' DOES NOT EXIST"
双引号分隔符的位置对于强制显示不存在的事物的名称至关重要。不存在的东西的名称只是任意文本,斯塔塔对这种文本没有任何问题

简而言之,当馈送至
显示时

  "`macro'" 
是要显示的字符串,但

 `macro' 
要显示的变量或标量的名称,或具有要显示的已定义内容的宏的名称

顺便说一句,您的循环只是覆盖了先前存储的结果集,但您可能会在适当的时候得到它

 `macro'