Почему моя макропеременная не разрешается?

У меня есть макропеременная &myvar, но она не разрешается, когда я пытаюсь поместить ее в переменную шага данных. Почему этого не происходит, и что я могу сделать, чтобы это исправить?

%let myvar=Hello, world;
data _null_;
  x='&myvar.';
  put x=;
run;

person Joe    schedule 14.01.2015    source источник
comment
Это предназначено для закрытия вопросов как дубликатов, когда единственная проблема заключается в одинарных/двойных кавычках макропеременных. Если кто-то еще найдет хороший уже существующий, я буду рад его использовать, но я мог бы найти тот, в котором не было других сложностей, которые могли бы сбивать с толку.   -  person Joe    schedule 14.01.2015
comment
@NEOmen В некоторых случаях проще создать «фиктивный» вопрос, который менее сложен, чем другие вопросы, но, тем не менее, отвечает на то, что часто возникает, а затем использовать его как дубликат. «Фиктивный» вопрос по-прежнему должен быть технически хорошим вопросом сам по себе (как это есть), но, конечно, он не задается с целью получения информации :)   -  person Joe    schedule 14.01.2015


Ответы (2)


Макропеременные в SAS не разрешаются, если они заключены в одинарные кавычки, '&myvar'. Они должны быть в двойных кавычках, "&myvar", для правильного разрешения.

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

%str(%'&myvar.%')

%' внутри %str поместит символ одинарной кавычки (или апостроф) в текстовую строку сам по себе, не заставляя его заключаться в кавычки.

data _null_;
  x="%str(%'&myvar.%')";
  put x=;
run;

or

%let myvar2 = %str(%'&myvar.%');
person Joe    schedule 14.01.2015
comment
Именно внешние кавычки определяют, разрешаются ли макровыражения. Если вы уже заключаете строку в двойные кавычки, то %STR() для защиты одинарных кавычек не требуется. Просто используйте '&myvar'. В настройках макроса это можно сделать так: %sysfunc(dequote('&myvar'')) - person Tom; 01.08.2015
comment
Я думаю, Джо демонстрировал, как вы можете заставить макрос разрешаться, но также использовать одинарные кавычки. Это может понадобиться в команде X или SYSTASK. - person Jay Corbett; 09.01.2016

В SAS 9.4M6 или более поздней версии вы можете использовать %tslit() для достижения той же функции.

%let myvar=Hello, world;
data _null_;
  x=%tslit(%superq(myvar));
  put x=;
run;

%put %tslit(%superq(myvar));

x=Hello, world
'Hello, world'

Это макрос, предварительно определенный в SAS. Вот документация по этому поводу:
https://documentation.sas.com/?docsetId=lebaseutilref&docsetTarget=n1phgnraoodvpln1bm941n44yq7q.htm&docsetVersion=9.4&locale=en

person whymath    schedule 28.04.2020
comment
Обратите внимание, что вам не нужен макрос. Просто вызовите quote() и передайте одинарную кавычку в качестве второго аргумента. Вы можете использовать %sysfunc(), чтобы вызвать его в чистом коде макроса %sysfunc(quote(%superq(myvar),%str(%'))) - person Tom; 28.04.2020
comment
@Tom Конечно, возможно, но кажется сложнее, чем %str(%'&myvar.%'), не так ли? - person Joe; 28.04.2020
comment
@Joe Зависит от того, содержит ли уже цитируемое значение кавычки. И вызовет ли цитирование макроса проблемы в будущем. Макрос %TSLIT() — это слишком сложный способ генерации вызова %sysfunc() с запутанной логикой для имитации второго аргумента функции кавычек. - person Tom; 28.04.2020