2014-09-22 2 views
1

여러 번, 나는 그것이 만들어지지 않았 음을 알기 위해서만 매크로를 정의하려고 시도합니다.Stata 로컬 매크로가 정의되지 않았습니다.

  • 나의 첫번째 질문은 수동으로 내가 시도하는 모든 단일 의심스러운 local mylocal ... 정의 후 macro list를 입력하는 것보다 이러한 실패를 추적 할 수있는 더 좋은 방법은 무엇입니까?

  • 두 번째 이유는 로컬 정의가 자동으로 실패하는 이유는 무엇입니까? 이 이벤트에 대한 경고를 활성화하는 방법이 있습니까?

  • 세 번째로 아래 코드는 가장 최근에이 문제가 나를 좌절 시켰던 부분을 보여줍니다. 문자열 벡터에서 단어의 위치를 ​​파악합니다. 위치를 하나씩 감소시키는 단계; 해당 (직전) 위치에서 단어를 움켜 잡습니다. 모든 포인터를 환영 할 것입니다.

.

local cuts  0 15 32 50 
local mycut  32 
local myposn : list posof "`mycut'" in cuts 

// two methods that fail loudly: 
local mynewcut : word ``myposn'-1' of cuts 

local mynewcut : word `myposn'-1 of cuts 


// five methods that fail silently, creating nothing: 
local mynewcut : word `=`myposn'-1' of cuts // 1 

scalar tmp = `myposn' 
local mynewcut : word `=tmp-1' of cuts // 2 

scalar tmp2 = tmp -1 // 3 
local mynewcut : word `=tmp2' of cuts 

local mynewposn = `=`myposn'-1' 
local mynewcut : word `mynewposn' of cuts // 4 

local mynewcut : word `=`mynewposn'' of cuts // 5 

// also fails silently (and is not what I'm looking for): 
local mysamecut : word `myposn' of cuts 

답변

3

이 작동 :

local cuts  0 15 32 50 
local mycut  32 
local myposn : list posof "`mycut'" in cuts 

local mynewcut : word `=`myposn'-1' of `cuts' 
display "`mynewcut'" 

당신은 =를 사용하여 산술 연산을 평가해야합니다. 로컬 cuts을 참조 할 때 따옴표가 빠져 있습니다.

정의되지 않은 매크로를 사용하려고 시도하면 Stata가 오류로 간주하지 않습니다. 이것은 언어 디자인의 요소입니다. 또한 원하지 않는 구문 (적어도) 중 하나가 불법이 아니므로 이러한 경우에는주의를 기울여야합니다. of 이후에 Stata는 일부 문자열 만 예상하고 cuts은 문자열과 일치합니다. 이 경우 정상적으로 작동합니다.

local mynewcut : word 2 of cuts cuts2 cuts3 
display "`mynewcut'" 

예상과 다를 수 있습니다. 따옴표가 추가되면 상황이 변경됩니다. Stata는 이제 매크로 대체 작업을 수행해야한다는 것을 알고 있습니다.

나는 보통 지방 주민을 "생산"에 넣기 전에 잘 보았다. 하지만 assert을 사용할 수 있습니다. 예 :

local cuts  0 15 32 50 
local mycut  32 
local myposn : list posof "`mycut'" in cuts 
display "`myposn'" 

local mynewcut : word `=`myposn'-1' of cuts 
display "`mynewcut'" 

assert "`mynewcut'" != "" 
+0

Ah, duh, 내 매크로 변수 "cuts"에 대해 따옴표를 잊어 버렸습니다. 이러한 침묵 실패를 모니터링하는 데 도움이 될만한 조언이 있습니까? – Frank

+0

감사합니다. 나는'display' 또는'assert'를 사용하는 습관을 갖습니다. (개념적으로) 간단한 점검을 위해 많은 인용 부호가 필요하기 때문에 너무 나쁘다. Stata가'word # of '다음에 오는 모든 것을 어떻게 파싱하는지 흥미 롭습니다. – Frank

+1

"견적 문제"로 인해 물린 횟수를 잊어 버렸습니다. –

3

Roberto는 훌륭한 세부 답변을주었습니다. 중요한 것은 정확히 이 (가)으로 실패하고 Stata가 동의 할 수 있는지 여부입니다.

기존의 로컬 매크로를 블랭킹하고 빈 문자열을 (잠재적 인) 로컬 매크로 이름에 할당하는 것은 Stata에 관한 한 동일한 효과를냅니다. 내가

local foo = 42 
local foo 

또는

local bar 

를 이동하는 경우 프로세스가 종류에 차이가 있지만, 최종 결과는 비슷합니다. 첫 번째 경우 foo이라는 로컬이 사라지고 두 번째 경우 로컬 매크로 bar이 생성되지 않습니다.두 번째 경우는 쓸모가 없습니다. 예를 들어 프로그래머가 로컬 매크로가 처음에는 비어 있다는 것을 분명히하고 싶거나 (또는 ​​불가능한 경우를 제외하고) 이전에 만든 매크로를 제거하려고합니다.

더 간결하게 말하자면, Stata는 적어도 사용자가 염려하는 (로컬 또는 글로벌) 매크로와 존재하지 않는 매크로 사이를 구별하지 않습니다. 문자열 정의 언어가 아닌 운영 체제 쉘에서 영감을 얻기 위해 정의를 이해한다면 이는 덜 이상합니다.

그러나 유용한 결과가 있습니다. 테스트

if "`bar'" != "" 

는 존재에 대한 테스트 및 지방 매크로 bar의 비 공허함에 대한 테스트를 모두이며, 그것은 너무 숫자와 매크로에 적용됩니다.

매크로에 비어 있지 않은 문자열을 넣고 문제가있는 경우 실수를하고 빈 문자열을 할당하여 끝내는 경우가 있습니다. 이는 프로그래밍 실수 일 수 있습니다. 그러나 위의 예가 이미 암시 한 것처럼 Stata에 관한 한 불법이 ​​아닙니다.

여기서 완전 함은 알 수 없지만 매크로 정의는 다른 이유로 불법 일 수 있습니다. 따라서 lg()이 없기 때문에

local foo = lg(42) 

이 실패합니다. 반면에,

local foo lg(42) 

에는 평가가 적용되지 그래서 STATA가 lg(42)을 일해야하지 않기 때문에 STATA에 관한 한 지금까지 성공합니다. 매크로는 lg(42)을 텍스트로 포함합니다.

+0

사려 깊은 요약 주셔서 감사합니다. Stata는 명령을 불법으로 간주 할 필요가 없습니다. 여기서'local foo my_dumb_attempt'는 "foo"다음에 문자가 있고 "foo"에 빈 문자열을 할당한다는 것을 의미합니다. Stata는 프로그래머를위한 언어로보기 힘들 기 때문에 훨씬 더 손보는 것을 기대합니다. – Frank

+0

기술적 인 질문을 개인적 또는 주관적인 의견과 섞고 있습니다. 일대일 논쟁은 재미 있지만 간결한 답장에는 쉽게 도움이되지 않습니다. Stata는 많은 사람들이 프로그램하고 장기간 즐겁게 사용할 수있는 언어입니다. 마타 (Mata)는 다른 많은 사람들의 프로그래밍 언어 아이디어와 같은 임베디드 언어입니다. 둘 다 손에 들고 있거나 경고 할 때 부족한 언어입니다. 그것은 그 자체로 하나의 질문이 될 수 있습니다. 당신의 구체적인 예'local foo my_dumb_attempt'는 완벽하게 합법적입니다; Stata 프로그래머는 항상 매크로에 이러한 텍스트 복사를 사용합니다. –

+0

충분합니다. 명확히하기 위해,'my_dumb_attempt'에 의해, 나는 빈 문자열에 자동으로 도착하는 수많은 방법 중 하나를 말 그대로 문자 그대로 입력하거나 전달하지 않았습니다. 나는 마타를 배우기를 고대합니다. – Frank

관련 문제