emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Babel: communicating irregular data to R source-code block
@ 2012-04-21 20:17 Michael Hannon
  2012-04-22  0:44 ` Thomas S. Dye
  0 siblings, 1 reply; 17+ messages in thread
From: Michael Hannon @ 2012-04-21 20:17 UTC (permalink / raw)
  To: Org-Mode List



Greetings.  I'm sitting in on a weekly, informal, "brown-bag" seminar on data
technologies in statistics.  There are more people attending the seminar than
there are weeks in which to give talks, so I may get by with being my usual,
passive-slug self.

But I thought it might be useful to have a contingency plan and decided that
giving a brief talk about Babel might be useful/instructive.  I thought (and
think) that mushing together (with attribution) some of the content of the
paper [1] by The Gang of Four and the content of Eric's talk [2] might be a
good approach.  (BTW, if this isn't legal, desirable, permissible, etc., this
would be a good time to tell me.)

I liked the Pascal's Triangle example (which morphed from elisp to Python, or
vice versa, in the two references), but I was afraid that the elisp routine
"pst-check", used as a check on the correctness of the previously-generated
Pascal's triangle, might be too esoteric for this audience, not to mention me.
(The recursive Fibonacci function is virtually identical in all languages,
but the second part is more obscure.)

I thought it should be possible to use R to do the same sanity check, as R
would be much more-familiar to this audience (and its use would still
demonstrate the meta-language feature of Babel).

Unfortunately, I haven't been able to find a way to communicate the output of
the Pascal's Triangle example to an R source-code block.  The gist of the
problem seems to be that regardless of how I try to grab the data (scan,
readLines, etc.) Babel always ends up trying to read a data frame (table) and
I get an error similar to:

<<<<<<
> Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,
> : line 1 did not have 5 elements

Enter a frame number, or 0 to exit   

1: read.table("/tmp/babel-3780tje/R-import-3780Akj", header = FALSE, row.names
= NULL, sep = "
>>>>>>

If I construct a table "by hand" with all of the cells occupied, everything
goes OK.  For instance:

<<<<<<
#+TBLNAME: some-junk
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 2 | 1 | 0 |
| 1 | 3 | 3 | 1 | 

#+NAME: read-some-junk(sj_input=some-junk)
#+BEGIN_SRC R

rowSums(sj_input)

#+END_SRC  

#+RESULTS: read-some-junk
| 1 |
| 2 |
| 4 |
| 8 |
>>>>>>

But the following gives the kind of error I described above:

<<<<<<
#+name: pascals_triangle
#+begin_src python :var n=5 :exports none :return pascals_triangle(5)
def pascals_triangle(n):
    if n == 0:
        return [[1]]
    prev_triangle = pascals_triangle(n-1)
    prev_row = prev_triangle[n-1]
    this_row = map(sum, zip([0] + prev_row, prev_row + [0]))
    return prev_triangle + [this_row]

pascals_triangle(n)
#+end_src

#+RESULTS: pascals_triangle
| 1 |   |    |    |   |   |
| 1 | 1 |    |    |   |   |
| 1 | 2 |  1 |    |   |   |
| 1 | 3 |  3 |  1 |   |   |
| 1 | 4 |  6 |  4 | 1 |   |
| 1 | 5 | 10 | 10 | 5 | 1 |

#+name: pst-checkR(pas_inputs=pascals_triangle)
#+BEGIN_SRC R

rowSums(pas_inputs)

#+END_SRC
>>>>>>

Note that I don't really want to do rowSums in this case.  I'm just trying to
demonstrate the error.

Of course, it's clear that the first line does NOT contain five elements, nor
does the second, etc., as all of the above-diagonal elements are blanks.

But I've been unable to find an R input function that doesn't end up treating
the source data as a table, i.e., in the context of Babel source blocks -- R
is "happy" to read a lower-diagonal structure.  See the appendix for an
example.

Any suggestions?  Note that I'm happy to acknowledge that my own ignorance of
R and/or Babel might be the source of the problem.  If so, please enlighten
me.

Thanks.

-- Mike

[1] http://www.jstatsoft.org/v46/i03
[2] https://github.com/eschulte/babel-presentation

<<<<<<
appendix
--------


$ cat pascal.dat
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

$ R --vanilla < pascal.R

R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-redhat-linux-gnu (64-bit)
.
.
.

> x <- readLines("pascal.dat")
> x
[1] "1"         "1 1"       "1 2 1"     "1 3 3 1"   "1 4 6 4 1"
> str(x)
 chr [1:5] "1" "1 1" "1 2 1" "1 3 3 1" "1 4 6 4 1"
> 
> y <- scan("pascal.dat")
Read 15 items
> y
 [1] 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
> str(y)
 num [1:15] 1 1 1 1 2 1 1 3 3 1 ...
> 
> z <- read.table("pascal.dat", header=FALSE)
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 1 did not have 5 elements
Calls: read.table -> scan
Execution halted

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2012-04-26  6:34 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-21 20:17 Babel: communicating irregular data to R source-code block Michael Hannon
2012-04-22  0:44 ` Thomas S. Dye
2012-04-22 15:58   ` Eric Schulte
2012-04-23 16:46     ` Thomas S. Dye
2012-04-23 15:41       ` Eric Schulte
2012-04-23 19:17         ` Thomas S. Dye
2012-04-23 22:24     ` Michael Hannon
2012-04-23 21:05       ` Eric Schulte
2012-04-24  0:23       ` Thomas S. Dye
2012-04-23 22:55         ` Eric Schulte
2012-04-24  6:44           ` Thomas S. Dye
2012-04-24  7:07             ` Michael Hannon
2012-04-24 17:18               ` Thomas S. Dye
2012-04-24 19:23                 ` Thomas S. Dye
2012-04-25 23:52               ` Thomas S. Dye
2012-04-26  2:06                 ` Michael Hannon
2012-04-26  6:34                   ` Thomas S. Dye

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