Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Emacs to ignore contents of \Sexpr{} command in Sweave document to prevent incorrect $-based syntax highlighting

When editing an Sweave document in LaTeX (using the Noweb mode), Emacs knows to "ignore" code that is in <<>>= blocks. However, for interstitial \Sexpr{} blocks, this isn't the case. Given that R references by columns via '$' and LaTeX uses $ to set-off equations, these \Sexpr{} blocks often break the syntax highlighting, like so:

Emacs highlighting issue when using Sweave

I have a very rudimentary understanding the elisp & Emacs syntax highlighting, but my hope is that it might be possible to add something to .emacs that will disable any parsing/$ detection within \Sexpr{}'s.

like image 748
John Horton Avatar asked Mar 26 '12 17:03

John Horton


3 Answers

I thought emacs with ESS has correct syntax highlighting for Sweave?

Anyway, the easiest "fix" is to just not use the $ operator but [[ instead. For example:

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

Should give the same result. I think foo$p.value is just short for foo[["p.value",exact=FALSE]]

like image 65
Sacha Epskamp Avatar answered Oct 19 '22 11:10

Sacha Epskamp


I don't have a fix either, but I'll pass along my workaround, which is to never (well, rarely) do any processing in \Sexpr chunks but instead to store things I want to use in \Sexpr in variables, and to do so in the same chunk I do the main calculations in.

<<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}.

While there are some downsides to this, I find it helps me to better keep track of what I want to present, and how I want to present it.

As an aside, consider using formatC instead of round as it can keep significant zeros (ie, 0.10 instead of 0.1).

like image 21
Aaron left Stack Overflow Avatar answered Oct 19 '22 11:10

Aaron left Stack Overflow


I have no good answer for you as I am not an Emacs hacker, so I usually do one of two things:

  • Either add a simple % $ comment at the of the line to "close" the math expression from $ to $,

  • Or rewrite the expression to not use $-based subsetting:
    round(as.numeric(chisq.test(someVar)["p.value"]), 2).

like image 29
Dirk Eddelbuettel Avatar answered Oct 19 '22 13:10

Dirk Eddelbuettel