From e4263daf76c50eda0021dddb2fd02994b6c15f57 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Sat, 30 May 2009 16:45:26 -0400 Subject: [PATCH] Make org table result have header row and hline when appropriate. (This should have been included with commit a39d68640e3fbc059f3b05c9eafc8bf07cc4b51d). The approach I've taken is to make R always write the column names into the tsv file. If the result does not have user-supplied column-names, then R writes default column names of the form V1,V2,...,V$numcols. After reading the tsv back into lisp, we check whether it has "real" column names or the R defaults. If it has real column names, then I give the org table an hline. I expect this will conflict with Eric's work on sessions, but we can deal with that. There is a remaining quoting issue that needs to be dealt with. E.g. with an unquoted string in the input, it comes out as quoted in the result. This seems bad, since if you use the output as new input you get something different (with extra quoting). (non-idempotence if that's the right term). | col1 | col2 | col3 | |------+---------+------| | 1 | 2 | 3 | | 4 | schulte | 6 | tabel | "col1" | "col2" | "col3" | |--------+-----------+--------| | 1 | 2 | 3 | | 4 | "schulte" | 6 | --- lisp/org-babel-R.el | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lisp/org-babel-R.el b/lisp/org-babel-R.el index 70087e191..e81d97d70 100644 --- a/lisp/org-babel-R.el +++ b/lisp/org-babel-R.el @@ -79,18 +79,18 @@ R process in `org-babel-R-buffer'." `org-babel-R-buffer' as Emacs lisp." (let ((tmp-file (make-temp-file "org-babel-R")) result) (org-babel-R-input-command - (format "write.table(%s(), \"%s\", , ,\"\\t\", ,\"nil\", , FALSE, FALSE)" func-name tmp-file)) + (format "write.table(%s(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=TRUE, quote=FALSE)" + func-name tmp-file)) (with-temp-buffer - (message "before condition") (condition-case nil (progn (org-table-import tmp-file nil) (delete-file tmp-file) (setq result (mapcar (lambda (row) (mapcar #'org-babel-R-read row)) - (org-table-to-lisp)))) + (org-table-to-lisp))) + (setq result (org-babel-R-set-header-row result))) (error nil)) - (message "after condition") (if (null (cdr result)) ;; if result is trivial vector, then scalarize it (if (consp (car result)) (if (null (cdr (car result))) @@ -99,6 +99,20 @@ R process in `org-babel-R-buffer'." (car result)) result)))) +(defun org-babel-R-set-header-row (table) + "Check whether the table appears to have (a) genuine +user-supplied column names, or (b) default column names added +automatically by R. In case (a), maintain the first row of the +table as a header row and insert an hline. In case (b), remove +the first row and return the org table without an hline." + (if (string-equal (caar table) "V1") + ;; The first row looks like it contains default column names + ;; added by R. This condition could be improved so that it + ;; checks whether the first row is ("V1" "V2" ... "V$n") where + ;; $n is the number of columns. + (cdr table) + (cons (car table) (cons 'hline (cdr table))))) + (defun org-babel-R-read (cell) "Strip nested \"s from around strings in exported R values." (org-babel-read (or (and (stringp cell)