2014-10-16 2 views
3

Я сделал список имен переменных и хотите проверить, какие переменные я исключены. Последняя строка моей догадки не работает, потому что r(varlist) не имя макроса:используя обратный список макросов с `: список» синтаксис

input abc bca cba 
1 1 1 
end 

global mykeeps abc cba 

ds 
di "`: list local(r(varlist)) - global(mykeeps)'" 

Я знаю, что я мог бы сделать неуклюжий три лайнера здесь:

local rvarlist "`r(varlist)'" 
di "`: list rvarlist - global(mykeeps)'" 
macro drop rvarlist 

Я прошу, если есть более краткий (или иначе лучший) способ.

Я просмотрел документацию на help macrolists и help return list.

ответ

3

Вы можете сделать свой код «неуклюжим» двухстрочным, если вы сделаете вывод, что вам не нужно отбрасывать локальный макрос rvarlist. Местные жители просто исчезают сами по себе. Обычно я не вижу необходимости явно бросать их, хотя я не хочу сказать, что это никогда не нужно.

Я бы больше беспокоиться об использовании global с. Их использование может иметь непреднамеренные эффекты, поскольку, в отличие от local, они не вымирают и могут столкнуться с другими пространствами имен систем/программ. Используйте их только тогда, когда вы действительно знаете, что вы делаете

Альтернативы кода может быть следующим, но вы потеряете функциональность, если вы отфильтровывать переменные с ds:

clear 
set more off 

input abc bca cba 
1 1 1 
end 

local mykeeps abc cba 
unab myvars: _all 

di "`:list myvars - mykeeps'" 

Если вы устанавливаете пользовательскую команду findname (SSC от Nick Cox), вы получаете функциональность и допускаете прямое создание локального макроса. Отфильтрованный список переменных могут быть помещены в локальный непосредственно:

clear 
set more off 

input abc bca cba 
1 1 1 
end 

local mykeeps abc cba 
findname, local(myvars) 

di "`:list myvars - mykeeps'" 

Смотрите соответствующие файлы справки, а также Speaking Stata: Finding variables.

+0

Спасибо, Роберто! 'unab' и пакет' findname' выглядит очень удобно. Я надеялся, что макросы «r-class» имеют некоторые секретные имена макросов, которые можно просто подключить. В конце концов, это макросы ... Кстати, часть неуклюжести, которую я вижу в моем исходном коде, количество разделителей (круглые скобки и кавычки), а не только дополнительные строки. – Frank

+1

Вы также можете использовать 'local rvarlist = r (varlist)' и сохранять кавычки в исходном коде. –

+1

Что касается моего последнего комментария: Я прочитал «Ссылаясь на г (макро) без кавычек никогда не является хорошей идеей, эта функция была включена только для полноты». См. ** [R] ** сохраненные результаты, которые содержат интересную информацию. –

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