If statement 程序中使用语法的硬编码和可选[if]语句

If statement 程序中使用语法的硬编码和可选[if]语句,if-statement,syntax,stata,If Statement,Syntax,Stata,我正在学习如何在编写简单的Stata程序时使用可选的语法,我想知道是否可以在通过语法选项传递可选的[if]语句的同时对if语句进行硬编码 我知道一个简单的函数可以写成: sysuse auto program meanprice syntax [if] mean price `if' end 然后我可以使用一些可选的if语句,比如: meanprice if price > 6000 & rep78 > 2 但是,假设我想硬编码price>6000语

我正在学习如何在编写简单的Stata程序时使用可选的
语法
,我想知道是否可以在通过
语法
选项传递可选的
[if]
语句的同时对
if
语句进行硬编码

我知道一个简单的函数可以写成:

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 
但这显然不起作用(据我理解,因为
语法
正在解析文本/字符串?)


使用
语法
[if]
是否有任何简单的方法来实现所需的结果?我可以想到一些我宁愿避免的非常繁琐的解决方法。

您在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
--------------------------------------------------------------
代码的问题不在于
语法
解析文本[这始终是它的工作],而是两个
if
的组合需要更多的注意。你所拥有的会产生像<代码>如果
<代码>如果
。。。这是违法的

因此,如果用户提供一个
if
限定符(用户可选,但语法上不是选项)

  • 如果,则需要获取
    语法
    ,以去除用户提供的
    。如何执行此操作,请参见
    帮助语法

  • 然后需要使用
    组合这两个
    if
    条件。插入括号可能会有所帮助

  • 编辑:如果要在用户的
    If
    中使用带引号的字符串,则在程序中使用复合双引号:

    if `"`if'"' != "" local if `"& (`if')"'  
    
    一般评论:虽然您想要的是可编程的,但我认为这是不必要的,值得怀疑的做法:

  • 对于分析的审计跟踪,在开始附近带有
    keep if
    语句的do文件和相应的日志文件应足以作为数据子集工作的可复制记录

  • 相反,对于审计跟踪而言,使用高度专业化的程序以及代码中内置的特定于数据的约束很容易被误解或忽视,特别是对于使用您的工作的其他人,甚至是您自己

  • 遵循这一策略会带来编写大量非常具体的程序的负担,时间和精力的利用率很低,对其他人几乎没有用处


  • 虽然我把这当作一个编程问题来解决,但我越想它,它就越是一个糟糕的编程策略。有关更多信息,请参见下面的一般性评论。