Editing/adding on to Sweave features in ESS

I really like David Whiting’s Sweave methods in ESS: M-n s M-n P and I get a compiled pdf file. However, i wanted to change it so Sweave uses the cacheSweaveDriver() when sweaving. I knew the the functions were defined in the ess-swv.el file (in my carbon emacs in Mac OS X, it is at /Applications/Emacs.app/Contents/Resources/site-lisp/ess/ess-swv.el). Now, I edited the file to create a new way to Sweave:

<pre class="src src-emacs-lisp"><span style="color: #ff4500;">;;; </span><span style="color: #ff4500;">changed by vinh</span>

(defun ess-swv-run-in-R2 (cmd &optional choose-process) “Run \[cmd] on the current .Rnw file. Utility function not called by user.” (let* ((rnw-buf (current-buffer))) (if choose-process ;; previous behavior (ess-force-buffer-current “R process to load into: “) ;; else (update-ess-process-name-list) (cond ((= 0 (length ess-process-name-list)) (message “no ESS processes running; starting R”) (sit-for 1); so the user notices before the next msgs/prompt (R) (set-buffer rnw-buf) ) ((not (string= “R” (ess-make-buffer-current))); e.g. Splus, need R (ess-force-buffer-current “R process to load into: “)) ))

(save-excursion (ess-execute (format “require(tools)”)) ;; Make sure tools is loaded. (basic-save-buffer); do not Sweave/Stangle old version of file ! (let* ((sprocess (get-ess-process ess-current-process-name)) (sbuffer (process-buffer sprocess)) (rnw-file (buffer-file-name)) (Rnw-dir (file-name-directory rnw-file)) (Sw-cmd (format “local({..od <- getwd(); setwd(%S); %s(%S, cacheSweaveDriver()); setwd(..od) })” Rnw-dir cmd rnw-file)) ) (message “%s()ing %S” cmd rnw-file) (ess-execute Sw-cmd ‘buffer nil nil) (switch-to-buffer rnw-buf) (ess-show-buffer (buffer-name sbuffer) nil)))))

(defun ess-swv-weave2 () “Run Sweave on the current .Rnw file.” (interactive) (ess-swv-run-in-R2 “Sweave”))

(define-key noweb-minor-mode-map “\M-nw” ‘ess-swv-weave2)

Now, I can do M-n w to Sweave with cacheSweaveDriver(). Tried it, didn’t work. After many trials, i decided to put this code in my .emacs file. Works. Hmm, wierd. Is ESS using a different ess-swv.el file? Tried deleting it from where i think it is. M-n s still works. Weird!!!

After some more searching, found out that the stuff is going on in the ess-swv.elc file. Deleted both files, M-n s doesn’t work anymore. Googled what *.elc is. It is a byte-compiled version of .el (to make things run faster in emacs, sometimes). So I did it to mine.

Byte compile for emacs: http://www.cs.utah.edu/dept/old/texinfo/emacs18/emacs\_26.html

So I open my ess-swv.el file in emacs, typed M-x byte-compile-file

Voila! .elc file created. Close emacs and run it again!

About Vinh Nguyen


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>