2014-04-04 5 views
1

Я хотел бы выполнить вычисления в Mata, возвращающие скалярный результат. Я хотел бы получить доступ к этому результату в макросе в Stata. Например, я типа:Мне нужен пример st_numscalar()

mata: st_numscalar("dog", sum(range(1,4,1)))

Тогда я типа (в Stata):

di `dog'

, а затем я получаю (ничего):

Когда Я ожидал получить:

10

Думая, что, возможно, макрос dog должен существовать первый, я префикс выше команды с:

scalar dog = 0

, но без костей.

Тогда, полагая, что скаляры странные, и почему бы просто не использовать старый добрый местный:

mata: st_local("dog", sum(range(1,4,1)))

Но это как раз дает горе (или нет локального имени «собака» с числовым значением создается заранее или нет).

Что мне не хватает?

+0

Итак, проблема в том, что я использую одинарные кавычки на стороне Stata? – Alexis

+0

Правильно: в первом примере вы ссылались на 'собаку, как на временное имя, но это не так. –

ответ

6

Два ключевых момента:

Скаляры скаляры и макросы макросы. Но скаляр может иметь временное имя, в котором вы можете запутаться.

Макросы строго строковые. Числовые скаляры могут содержать только числа. (Также имеются строковые скаляры.)

. mata : st_numscalar("frog", 42) 
. di frog 
42 

Это скаляр с постоянным именем. Но будьте осторожны: если бы у вас была переменная, называемая frog, эта интерпретация превзошла бы интерпретацию scalar.

. tempname toad 
. mata : st_numscalar("`toad'", 24) 
. di `toad' 
24 

Это скаляр с временным названием.

. mata : st_local("newt", "1000") 
. di `newt' 
1000 

Это местный макрос, который содержит строку "1000".

Вы можете делать такие вещи.

. di `newt' + `toad' 
1024 

Но это потому, что здесь происходят две вещи. Stata сначала интерпретирует ссылки на локальный макрос и скаляр и заменяет их содержимое. Таким образом, display затем видит

. di 1000 + 24 

и составляет расчет. Но вы можете настаивать на строковой интерпретации.

. di "`newt'`toad'" 
1000__000000 

, который подчеркивает, что вам необходимо постоянно держать различие между именем чего-то и его содержимым. Здесь строка

"`toad'" 

- имя скаляра, которое является временным названием.

Также рассмотреть это:

. local anothernewt = 1000 
. di `anothernewt' 
1000 
. di "`anothernewt'" 
1000 

Stata позволяет указать числовой интерпретации или интерпретации строки. Конечно, результаты выглядят одинаково, но в принципе они разные. Вопрос в том, что это вас укусит (не в этом примере).

+0

Если макросы являются строковыми строками, то почему 'local dog = 13', а затем' 'di' dog '* 3'' производят '39'? – Alexis

+1

Уже объяснено. Пожалуйста, прочитайте ответ еще раз. 'display' понимает, что' di 13 * 3' означает, что вы хотите числовой расчет. 'display' никогда не видит локальный макрос как таковой, а просто его содержимое, поскольку Stata интерпретирует все ссылки на макросы до того, как какая-либо конкретная команда начнет работать. –

Смежные вопросы