楼主: eblog
10309 43

[编程问题求助] Stata编程(讨论4) [推广有奖]

31
eblog 发表于 2010-2-1 12:52:13
sungmoo 发表于 2010-2-1 12:47
eblog 发表于 2010-2-1 12:09 qui cap assert sqrt(abs(`x'))!=.
只用abs()即可。

(missing value(.)不算numeric)

32
arlionn 在职认证  发表于 2010-2-1 15:51:53
sungmoo 发表于 2010-2-1 12:15
arlionn 发表于 2010-2-1 11:26 这个可以用
local type: type `1'
if "`type'" != "numeric"{
  ……
}
这样的语句控制一下。
loc macro: type后面须接变量名吧?
经查验,的确如此,此前考虑欠妥。

33
sungmoo 发表于 2010-2-1 18:28:37
eblog 发表于 2010-2-1 12:09 以下代码应该可以比较方便的控制参数为numeric:
  syntax anything
  foreach x in `anything' {
    qui cap assert sqrt(abs(`x'))!=.
    if _rc {
      di as text _n "The input " as result "`x'" as text " not be numeric! try again please! "
      exit
    }
  }
*单纯检验`anything'是否只包含实数与空格:
……
syntax anything
loc x=subinstr("`anything'"," ",",",.)
cap as max(`x')<.
if _rc{
  di as error "Only real numbers can be input"
  exit
}
……

34
772183814 发表于 2010-2-1 18:42:29
看不懂啊,哥们

35
eblog 发表于 2010-2-1 18:45:01
sungmoo 发表于 2010-2-1 18:28
eblog 发表于 2010-2-1 12:09 以下代码应该可以比较方便的控制参数为numeric:
  syntax anything
  foreach x in `anything' {
    qui cap assert sqrt(abs(`x'))!=.
    if _rc {
      di as text _n "The input " as result "`x'" as text " not be numeric! try again please! "
      exit
    }
  }
*单纯检验`anything'是否只包含实数与空格:
……
syntax anything
loc x=subinstr("`anything'"," ",",",.)
cap as max(`x')
不光是abs(),max(),其它的大多数 math functions 都可以达到相同的效果

36
sungmoo 发表于 2010-2-1 18:52:11
eblog 发表于 2010-2-1 18:45 不光是abs(),max(),其它的大多数 math functions 都可以达到相同的效果
用max()是为了把`anything'放到一个函数里。

37
eblog 发表于 2010-2-1 18:58:37
sungmoo 发表于 2010-2-1 18:52
eblog 发表于 2010-2-1 18:45 不光是abs(),max(),其它的大多数 math functions 都可以达到相同的效果
用max()是为了把`anything'放到一个函数里。
是的,因为non-numeric型字符无法应用math functions计算,而numeric型字符可以,所以capture的_rc会有所不同
如果可以直接像这样定义就好了:syntax anything(min=2 max=2 numeric)

38
马续涛 发表于 2010-2-1 22:24:30
优势技术贴呀

39
ruclaolan 发表于 2010-2-1 23:13:16
学到不少东西,谢谢
laolan

40
eblog 发表于 2010-2-2 13:49:49
ruclaolan 发表于 2010-2-1 23:13
学到不少东西,谢谢
多参与讨论,共同进步!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 13:42