From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dan Davison Subject: [babel] creating simple vectors in R Date: Tue, 05 Oct 2010 21:37:48 +0100 Message-ID: <87zkusxtnn.fsf@stats.ox.ac.uk> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from [140.186.70.92] (port=60601 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P3EHW-0002Wp-Si for emacs-orgmode@gnu.org; Tue, 05 Oct 2010 16:38:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P3EHS-0007PD-Se for emacs-orgmode@gnu.org; Tue, 05 Oct 2010 16:38:36 -0400 Received: from markov.stats.ox.ac.uk ([163.1.210.1]:42712) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P3EHS-0007Oz-LV for emacs-orgmode@gnu.org; Tue, 05 Oct 2010 16:38:34 -0400 Received: from blackcap.stats.ox.ac.uk (blackcap.stats [163.1.210.5]) by markov.stats.ox.ac.uk (8.13.6/8.13.6) with ESMTP id o95KcVOn028521 for ; Tue, 5 Oct 2010 21:38:32 +0100 (BST) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs org-mode mailing list 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)