Как обрабатывать латексные команды в R? - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю с knitr () и хочу преобразовать встроенные латексные команды, такие как "\ label" и "\ ref", в зависимости от цели вывода (Latex или HTML).

Для этого мне нужно (программно) сгенерировать допустимые R-строки, которые правильно представляют обратную косую черту: например, «\ label» должен стать «\\ label». Цель состоит в том, чтобы заменить все обратные косые черты в фрагменте текста двойными обратными косыми чертами.

но кажется, что я не могу даже прочитать эти строки, не говоря уже о том, чтобы обработать их: если я определю:

okstr <- function(str) "do something"

тогда когда я позвоню

okstr("\label")

Я напрямую получаю сообщение об ошибке "Нераспознанная escape-последовательность" (конечно, так как \ l ошибочно)

Итак, мой вопрос: кто-нибудь знает способ чтения строк (в R), без использования механизма экранирования?

Да, я знаю, что мог бы сделать это вручную, но в том-то и дело: мне нужно сделать это программно. Есть много вопросов, которые близки к этому, и я потратил некоторое время на просмотр, но я не нашел ни одного, который бы дал для этого реальное решение.

С уважением.

1 Ответ

0 голосов
/ 05 сентября 2018

Внутри кода R необходимо соблюдать синтаксические соглашения R. А поскольку \ в строках используется как escape-символ, ему необходимо сформировать допустимую escape-последовательность (а \l не является допустимой escape-последовательностью в R).

Обойти это просто невозможно.

Но если вы читаете строку из другого места, например, используя readLines, scan или любую другую функцию чтения файлов, вы уже получаете правильную строку, и обработка не требуется.

В качестве альтернативы, если вы абсолютно хотите писать LaTeX-подобные команды в литеральных строках внутри R, просто используйте другой символ для \; например, +. Просто убедитесь, что ваша функция правильно обрабатывает ее везде, и что у вас есть способ вернуть литерал + обратно. Вот предложение:

okstr("+label{1 ++ 2}")

Затем для реализации okstr необходимо заменить один + на \ и удвоить ++ на + (в результате \label{1 + 2}). Но подумайте, в каком порядке это должно произойти, и как вы хотели бы рассматривать более сложные случаи; например, что должно дать следующее: okstr("1 +++label")?

...