我正在尝试检查程序中的 varlist 是否包含因子变量。我遵循StataCorp在此页面中的建议(http://www.stata.com/support/faqs/programming/factor-variable-support/)。建议的代码是:
syntax varlist(fv)
local fvops = "`s(fvops)'" == "true" | _caller() >= 11
if `fvops' {
// within this loop, you can expand the factor variable list,
// create a local for version control and perform any other
// steps needed for factor operated varlists
}
尽管如此,现在我觉得宏s(fvops)
并没有真正检查 varlist 中是否存在因子变量。一个简单的例子来说明:
capture program drop test_fvops
program test_fvops
syntax varlist(fv)
local fvops = "`s(fvops)'" == "true" | _caller() >= 11
qui reg `varlist'
if `fvops' {
di "factor variables specified"
}
else {
di "factor variables not specified"
}
end
sysuse auto,clear
test_fvops price mpg foreign weight i.rep78
test_fvops price mpg foreign weight rep78
奇怪的是,代码的最后两行都返回“指定的因子变量”。该程序无法判断第二行没有因子变量。
对宏s(fvops)
属性的进一步探讨只会让我更加困惑。
sysuse auto,clear
qui reg price mpg foreign weight i.rep78
local fvops = "`s(fvops)'" != "true" | _caller() >= 11
di "|s(fvops)=`s(fvops)'|fvops=`fvops'|"
qui reg price mpg foreign weight rep78
local fvops = "`s(fvops)'" != "true" | _caller() >= 11
di "|s(fvops)=`s(fvops)'|fvops=`fvops'|"
在这两种情况下,s(fvops)
为空,fvops
为1.我还尝试return list
和sreturn list
,但没有看到s(fvops)
。
我是否正确使用fvops
代码?我在Win 7上用Stata 13运行它。
添加了:
尼克的评论澄清了我在手册中找不到的东西。所以基本上不应该包含_caller()
段,并且链接页面的引用是我需要了解的s(fvops)
。
“要检查是否在varlist中指定了因子变量,您可以使用语法中保存的宏
s(fvops)
,当指定因子变量时,它将等于”true“,否则为空。”
答案 0 :(得分:3)
使用您自己的程序:您正在使用Stata 13,并且您的程序未将version
设置为其他任何内容。
因此_caller()
在两种情况下都大于11,并且您的测试没有测试。
为什么不尝试显示s(fvops)
的值?
使用后面的代码,您的“进一步探测”:为什么期望s(fvops)
可见?您从未创建它,因为您没有使用syntax
。但由于同样的原因,本地宏fvops
为1:_caller()
大于11且|
运算符选择1.