emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Erik Iverson <eriki@ccbr.umn.edu>
To: Dan Davison <davison@stats.ox.ac.uk>
Cc: emacs org-mode mailing list <emacs-orgmode@gnu.org>
Subject: Re: [babel] creating simple vectors in R
Date: Tue, 05 Oct 2010 16:35:17 -0500	[thread overview]
Message-ID: <4CAB9A15.5010806@ccbr.umn.edu> (raw)
In-Reply-To: <87zkusxtnn.fsf@stats.ox.ac.uk>

Hello,

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

I use R daily, with and without org-mode, but have never investigated
these features of passing tables and Lisp lists to source blocks, but
it looks interesting.  More below.

> 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
> 

What happens with "non-atomic" lists that contain mixed types?
They could either be turned into a vector of the lowest common
type, e.g., '(1 "hi") is turned into a character vector, or this
could be turned into an R list.  Then you'd be going from
Lisp List -> R list data types.

> 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.
> 

Yes, only since data.frames may and almost always do contain
mixed types.  Which goes back to the first question about the
behavior of this code when there are mixed types.  I think for
this case, if you're taking a single row of an org-table,
turning it into a vector is an OK thing to do, and
is something I probably would rarely do.  For columns,
I definitely think it's an OK thing to do, and it's more likely
I'd be passing in a single column of an org-table as opposed
to a single row.

In R, for columns, subsets of data.frames only return data.frames
with certain indexing styles, and even then,
setting drop = TRUE will return a vector.

 > df1 <- data.frame(a = 1:10, b = 2:11)

 > is.vector(df1$a)
[1] TRUE

 > is.vector(df1[["a"]])
[1] TRUE

 > is.vector(df1[, "a"])
[1] FALSE

 > is.vector(df1[, "a", drop = TRUE])
[1] TRUE

> 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)
> 
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode

      reply	other threads:[~2010-10-05 21:35 UTC|newest]

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

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=4CAB9A15.5010806@ccbr.umn.edu \
    --to=eriki@ccbr.umn.edu \
    --cc=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).