Получите Emacs, чтобы игнорировать содержимое команды \ Sexpr {} в документе Sweave, чтобы предотвратить некорректную подсветку синтаксиса на основе $ - PullRequest
13 голосов
/ 26 марта 2012

При редактировании документа Sweave в LaTeX (в режиме Noweb) Emacs знает, что нужно «игнорировать» код, который находится в блоках << >> =.Однако для промежуточных блоков \ Sexpr {} это не так.Учитывая, что R ссылается на столбцы через '$', а LaTeX использует $ для замещения уравнений, эти блоки \ Sexpr {} часто нарушают подсветку синтаксиса, например:

Emacs highlighting issue when using Sweave

У меня есть очень элементарное понимание подсветки синтаксиса elisp & Emacs, но я надеюсь, что возможно будет добавить что-то в .emacs, что отключит любое обнаружение синтаксического анализа / $ в \ Sexpr {}.

Ответы [ 3 ]

8 голосов
/ 26 марта 2012

Я думал, что Emacs с ESS имеет правильную подсветку синтаксиса для Sweave?

В любом случае, самое простое "исправление" - просто не использовать оператор $, а [[.Например:

foo$p.value
foo[['p.value']]

Должен дать тот же результат.Я думаю foo$p.value это просто сокращение от foo[["p.value",exact=FALSE]]

7 голосов
/ 27 марта 2012

У меня тоже нет исправления, но я пропущу свой обходной путь, который заключается в том, чтобы никогда (ну, редко) не выполнять какую-либо обработку в \Sexpr чанках, а вместо этого хранить вещи, которые я хочу использовать в \Sexpr в переменных, и чтобы сделать это в том же блоке, я делаю основные вычисления в.

<<echo=FALSE, results=hide>>=
t1 <- chisq.test(someVar)
p1 <- formatC(t1$p.value, format="%f", digits=2)
@

\dots with a $p$-value of \Sexpr{p1}.

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

В качестве альтернативы рассмотрите возможность использования formatC вместо round, поскольку оно может содержать значительные нули (т. Е. 0,10 вместо 0,1).

5 голосов
/ 26 марта 2012

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

  • Либо добавьте простой % $ комментарий к строке, чтобы "закрыть" математическое выражение от $ до $,

  • Или переписать выражение, чтобы не использовать $ подмножество:
    round(as.numeric(chisq.test(someVar)["p.value"]), 2).

...