我在编写简单的Stata程序时学习如何使用可选的syntax
,并且我想知道是否可以在同一时间对if
语句进行硬编码时间通过[if]
选项传递可选的syntax
语句。
我知道一个简单的函数可以写成:
sysuse auto
program meanprice
syntax [if]
mean price `if'
end
然后我可以使用一些可选的if
语句,例如:
meanprice if price > 6000 & rep78 > 2
但是,我想说我想对price > 6000
语句进行硬编码,但仍然可以有选择地选择if
语句。我想这样做的原因是我想要硬编码的部分是非常严格的,我总是希望通过我写的一些嵌套程序传递这些选项,而不必每次都指定它们。
我尝试过使用例如
program meanprice_test
syntax [if]
mean price if price > 6000 `if'
end
但这显然不起作用(据我所知,因为syntax
正在解析文本/字符串?)
使用syntax
和[if]
是否有任何简单的方法可以达到预期的结果?我可以想到一些非常繁琐的解决方法,我宁愿避免。
答案 0 :(得分:4)
您在Stata术语中定义的是命令,而不是函数。
"显然不起作用"应始终通过提供错误消息或指示问题的其他显式结果来解释。
除此之外,请考虑一下:
program meanprice_test
syntax [if/]
if "`if'" != "" local if "& (`if')"
mean price if price > 6000 `if'
end
. sysuse auto
(1978 Automobile Data)
. meanprice_test if foreign
Mean estimation Number of obs = 9
--------------------------------------------------------------
| Mean Std. Err. [95% Conf. Interval]
-------------+------------------------------------------------
price | 8783.667 827.6595 6875.08 10692.25
--------------------------------------------------------------
. meanprice_test
Mean estimation Number of obs = 23
--------------------------------------------------------------
| Mean Std. Err. [95% Conf. Interval]
-------------+------------------------------------------------
price | 9655.696 635.944 8336.829 10974.56
--------------------------------------------------------------
您的代码问题不在于syntax
正在解析文本[始终是它的工作],而是两个if
的组合需要更多关注。你有什么会产生像...... if
...... if
这样的东西......这是非法的。
因此,如果用户提供if
限定符(对用户是可选的,但在语法上不是选项)
您需要syntax
取消用户提供的if
。如何执行此操作记录在help syntax
中。
然后,您需要使用&
来合并两个if
条件。括号可能会有所帮助。
编辑:如果在用户if
中使用引用字符串,则在程序中使用复合双引号:
if `"`if'"' != "" local if `"& (`if')"'
一般意见:虽然你想要的是可编程的,但我认为这是不必要和有问题的做法:
对于分析的审计跟踪,在开头附近具有keep if
语句的do文件和相应的日志文件应该足以作为对数据子集的可重现的工作记录。
对于审计跟踪,相反,使用代码中内置数据特定约束的高度专业化程序很容易被误解或忽视,特别是对于使用您工作的其他人,甚至是您以后的其他人。
遵循这一策略会带来编写大量非常具体的程序的负担,对时间和精力的使用不当,对其他人的用处不大。