Merge branch 'master' into session

Conflicts:
	org-babel.org
This commit is contained in:
Eric Schulte 2009-06-03 15:30:10 -07:00
commit 49db1e523c
2 changed files with 95 additions and 5 deletions

View file

@ -79,7 +79,7 @@ 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(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=TRUE, quote=FALSE)"
(format "write.table(%s(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=FALSE, quote=FALSE)"
func-name tmp-file))
(with-temp-buffer
(condition-case nil
@ -89,7 +89,8 @@ R process in `org-babel-R-buffer'."
(setq result (mapcar (lambda (row)
(mapcar #'org-babel-R-read row))
(org-table-to-lisp)))
(setq result (org-babel-R-set-header-row result)))
;; (setq result (org-babel-R-set-header-row result))
)
(error nil))
(if (null (cdr result)) ;; if result is trivial vector, then scalarize it
(if (consp (car result))
@ -105,7 +106,14 @@ 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")
(if (or (string-equal (caar table) "V1")
(string-equal (caar table) "x"))
;; write.table(1, col.names=TRUE) makes a colname called "x". I
;; think shows that this approach is too much of a hack: we
;; can't take some totally different action just because we see
;; an "x" there that might or might not be a automatic name.
;; 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

View file

@ -114,7 +114,7 @@ table, allowing the test suite to be run be evaluation of the table
and the results to be collected in the same table.
* Tasks [22/36]
* Tasks [22/37]
** TODO Create objects in top level (global) environment [0/5]
*sessions*
@ -573,7 +573,71 @@ we should color these blocks differently
*** TODO refine html exportation
should use a span class, and should show original source in tool-tip
** TODO allow tables with hline to be passed as args into R
** TODO formulate general rules for handling vectors and tables / matrices with names
This is non-trivial, but may be worth doing, in particular to
develop a nice framework for sending data to/from R.
*** Notes
In R, indexing vector elements, and rows and columns, using
strings rather than integers is an important part of the
language.
- elements of a vector may have names
- matrices and data.frames may have "column names" and "row names"
which can be used for indexing
- In a data frame, row names *must* be unique
Examples
#+begin_example
> # a named vector
> vec <- c(a=1, b=2)
> vec["b"]
b
2
> mat <- matrix(1:4, nrow=2, ncol=2, dimnames=list(c("r1","r2"), c("c1","c2")))
> mat
c1 c2
r1 1 3
r2 2 4
> # The names are separate from the data: they do not interfere with operations on the data
> mat * 3
c1 c2
r1 3 9
r2 6 12
> mat["r1","c2"]
[1] 3
> df <- data.frame(var1=1:26, var2=26:1, row.names=letters)
> df$var2
[1] 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
> df["g",]
var1 var2
g 7 20
#+end_example
So it's tempting to try to provide support for this in org-babel. For example
- allow R to refer to columns of a :var reference by their names
- When appropriate, results from R appear in the org buffer with "named
columns (and rows)"
However none (?) of the other languages we are currently supporting
really have a native matrix type, let alone "column names" or "row
names". Names are used in e.g. python and perl to refer to entries
in dicts / hashes.
It currently seems to me that support for this in org-babel would
require setting rules about when org tables are considered to have
named columns/fields, and ensuring that (a) languages with a notion
of named columns/fields use them appropriately and (b) languages
with no such notion do not treat then as data.
- Org allows something that *looks* like column names to be separated
by a hline
- Org also allows a row to *function* as column names when special
markers are placed in the first column. An hline is unnecessary
(indeed hlines are purely cosmetic in org [correct?]
- Org does not have a notion of "row names" [correct?]
The full org table functionality exeplified [[http://orgmode.org/manual/Advanced-features.html#Advanced-features][here]] has features that
we would not support in e.g. R (like names for the row below).
*** Initial statement: allow tables with hline to be passed as args into R
This doesn't seem to work at the moment (example below). It would
also be nice to have a natural way for the column names of the org
table to become the column names of the R data frame, and to have
@ -605,6 +669,24 @@ tabel
Another example is in the [[*operations%20in%20on%20tables][grades example]].
** PROPOSED Are we happy with current behaviour regarding vector/scalar output?
This simple example of multilingual chaining produces vector output if
there are spaces in the message and scalar otherwise.
#+begin_src R :var msg=msg-from-python
paste(msg, "und_R", sep="_")
#+end_src
#+srcname: msg-from-python
#+begin_src python :var msg=msg-from-elisp
msg + "_y_python"
#+end_src
#+srcname: msg-from-elisp
#+begin_src emacs-lisp :var msg="org-babel_speaks"
(concat msg "_elisp")
#+end_src
** PROPOSED conversion between org-babel and noweb (e.g. .Rnw) format
I haven't thought about this properly. Just noting it down. What
Sweave uses is called "R noweb" (.Rnw).