Для решения вопроса я думаю, что ответ Moody_Mudskipperss работает нормально, но, как вы просили некоторые уточнения ...
Вы должны быть осторожны с различными способами, в которых похожие вещи на самом деле хранятся в R, что означает, что они ведут себя по-разному.
Особенно с тем, как plotmath
обрабатывает метки, поскольку они пытаются эмулировать способ, которым character
-строки обычно обрабатываются, но затем применяют свои собственные правила. 3 вещи, которые вы смешиваете, я думаю:
character()
наиболее знакомо: просто строка. Печать может сбить с толку, когда кавычки и т. Д. Функция noquote
в основном говорит R отметить свой аргумент, чтобы кавычки не экранировались.
- вызовы являются "неоцененными вызовами функций": это инструкция относительно того, что должен делать R, но он еще не выполнен. Любые ошибки в этом вызове еще не появляются, и вы можете проверить это.
Обратите внимание, что вызов не имеет своего собственного окружения, что означает, что вызов может дать разные результаты, если оценивается, например. изнутри функции.
- Выражения похожи на вызовы, но применяются более широко, т. Е. Не всегда являются функцией, которую необходимо выполнить. Выражение может быть как именем переменной, так и простым значением, например «почему нет?». Кроме того, выражения могут состоять из нескольких единиц, как если бы вы использовали
{
Различные функции могут конвертировать между этими классами, но иногда функции (такие как paste
!) Также конвертируют неожиданно:
noquote
не так уж полезен, как уже указывал Moody_Mudskipper: он только меняет печать. Но объект в основном остается персонажем
substitute
не только подставляет переменные, но и преобразует свой первый аргумент в (чаще всего) вызов. Здесь print
кусает вас, потому что при печати вызова не предусмотрены специальные классы его участников. Попробуйте: sub[[3]]
из вопроса дает
[1] паста (курсив (да), "почему бы и нет?")
без обратной косой черты! Только при печати полного вызова noquote-part теряется.
parse
используется для преобразования символа в выражение. Пока ничего не вычисляется, но введена некоторая структура, чтобы вы могли манипулировать выражением.
paste
часто ведет себя раздражающе (хотя и задокументировано), так как может вставлять только строки символов. Следовательно, если вы кормите его чем-либо, кроме символа, он сначала вызывает as.character. Поэтому, если вы позвоните ему, вы просто получите текстовую строку снова. Таким образом, в вашем вопросе, даже если вы используете синтаксический анализ, как только вы начнете вставлять что-то вместе, вы снова получите кавычки.
Наконец, ваша проблема сложнее, потому что она использует внутреннюю логику plotmath
.
Это означает, что, как только вы попытаетесь оценить текст, вы, вероятно, получите сообщение об ошибке «не удалось найти курсив функции» (или более запутанную ошибку, если является функцией italic
, определенной в другом месте) , Предоставляя его в plotmath, он работает, потому что вызов оценивается только с помощью plotmath, что создаст приятную среду, в которой курсив работает, как и ожидалось.
Это все означает, что вам нужно рассматривать все это как выражение или вызов. Пока оценка не может быть выполнена (если только выражение you обрабатывает выражение, а не plotmath), все это должно оставаться выражением или вызовом. Подмена звонка работает, но вы также можете более точно подражать тому, что происходит в R, с помощью
call('paste', 'Hi', parse(text=text)[[1]])