emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Dan Davison <davison@stats.ox.ac.uk>
To: emacs org-mode mailing list <emacs-orgmode@gnu.org>
Subject: [babel] creating simple vectors in R
Date: Tue, 05 Oct 2010 21:37:48 +0100	[thread overview]
Message-ID: <87zkusxtnn.fsf@stats.ox.ac.uk> (raw)

I'd appreciate opinions from R users on the following org-babel-R
details:

Currently, Org tables, and lisp lists, are converted into data frames
when they are sent from Org to R, and we have no way to create simple
vectors such as c(1,2). I'd like to know whether users of org and R
would approve of the following change that makes simple R vectors
possible, or have other suggestions related to these issues.

With the patch below, there would be two ways to create a simple vector
in R. The most direct way is to pass a non-nested lisp list:

#+begin_src R :var x='(1 2) :results output
str(x)
#+end_src

CURRENT OUTPUT:
#+results:
: 'data.frame':	1 obs. of  2 variables:
:  $ V1: int 1
:  $ V2: int 2

NEW OUTPUT:
#+results:
:  num [1:2] 1 2

In addition, because babel's table-indexing code produces a non-nested
list when taking a one-dimensional slice, this would be another
situation in which a vector rather than data frame is created:

#+tblname: input-tab
    | 1 | 3 |
    | 2 | 4 |

#+begin_src R :var x=input-tab[0,] :results output
str(x)
#+end_src

CURRENT OUTPUT:
#+results:
: 'data.frame':	1 obs. of  2 variables:
:  $ V1: int 1
:  $ V2: int 3

NEW OUTPUT:
#+results:
:  num [1:2] 1 3

There's a possible argument that that's slightly at odds with R, since,
in R, a single row slice of a data frame is still a data frame.

A related issue is translating an Org table into a matrix rather than a
data frame in R. This can be done explicitly with a call to as.matrix in
the user's code, but if anyone feels that it would be helpful for babel
to automate this then do say so.

Dan


diff --git a/lisp/ob-R.el b/lisp/ob-R.el
index c709064..4b49af5 100644
--- a/lisp/ob-R.el
+++ b/lisp/ob-R.el
@@ -141,16 +141,18 @@ This function is called by `org-babel-execute-src-block'."
 (defun org-babel-R-assign-elisp (name value colnames-p rownames-p)
   "Construct R code assigning the elisp VALUE to a variable named NAME."
   (if (listp value)
-      (let ((transition-file (org-babel-temp-file "R-import-")))
-        ;; ensure VALUE has an orgtbl structure (depth of at least 2)
-        (unless (listp (car value)) (setq value (list value)))
-        (with-temp-file transition-file
-          (insert (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field)))
-          (insert "\n"))
-        (format "%s <- read.table(\"%s\", header=%s, row.names=%s, sep=\"\\t\", as.is=TRUE)"
-                name (org-babel-process-file-name transition-file 'noquote)
-               (if (or (eq (nth 1 value) 'hline) colnames-p) "TRUE" "FALSE")
-               (if rownames-p "1" "NULL")))
+      (if (listp (car value))
+         (let ((transition-file (org-babel-temp-file "R-import-")))
+           (with-temp-file transition-file
+             (insert (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field)))
+             (insert "\n"))
+           (format "%s <- read.table(\"%s\", header=%s, row.names=%s, sep=\"\\t\", as.is=TRUE)"
+                   name (org-babel-process-file-name transition-file 'noquote)
+                   (if (or (eq (nth 1 value) 'hline) colnames-p) "TRUE" "FALSE")
+                   (if rownames-p "1" "NULL")))
+       (format "%s <- %s"
+               name
+               (concat "c(" (mapconcat 'org-babel-R-quote-tsv-field value ",") ")")))
     (format "%s <- %s" name (org-babel-R-quote-tsv-field value))))
 
 (defvar ess-ask-for-ess-directory nil)

             reply	other threads:[~2010-10-05 20:38 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-05 20:37 Dan Davison [this message]
2010-10-05 21:35 ` [babel] creating simple vectors in R Erik Iverson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zkusxtnn.fsf@stats.ox.ac.uk \
    --to=davison@stats.ox.ac.uk \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).