From mboxrd@z Thu Jan 1 00:00:00 1970 From: tsd@tsdye.com (Thomas S. Dye) Subject: Re: Babel: communicating irregular data to R source-code block Date: Sat, 21 Apr 2012 14:44:49 -1000 Message-ID: References: <1335039472.9075.YahooMailNeo@web161901.mail.bf1.yahoo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([208.118.235.92]:34443) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SLkvJ-0005k7-LB for emacs-orgmode@gnu.org; Sat, 21 Apr 2012 20:45:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SLkvG-0007BH-Un for emacs-orgmode@gnu.org; Sat, 21 Apr 2012 20:45:05 -0400 Received: from oproxy5-pub.bluehost.com ([67.222.38.55]:57779) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1SLkvG-00073u-Hl for emacs-orgmode@gnu.org; Sat, 21 Apr 2012 20:45:02 -0400 In-Reply-To: <1335039472.9075.YahooMailNeo@web161901.mail.bf1.yahoo.com> (Michael Hannon's message of "Sat, 21 Apr 2012 13:17:52 -0700 (PDT)") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Michael Hannon Cc: Org-Mode List Aloha Michael, Michael Hannon writes: > Greetings.=C2=A0 I'm sitting in on a weekly, informal, "brown-bag" semina= r on data > technologies in statistics.=C2=A0 There are more people attending the sem= inar than > there are weeks in which to give talks, so I may get by with being my usu= al, > passive-slug self. > > But I thought it might be useful to have a contingency plan and decided t= hat > giving a brief talk about Babel might be useful/instructive.=C2=A0 I thou= ght (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.=C2=A0 (BTW, if this isn't legal, desirable, permissible, e= tc., 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 routi= ne > "pst-check", used as a check on the correctness of the previously-generat= ed > Pascal's triangle, might be too esoteric for this audience, not to mentio= n 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 outpu= t of > the Pascal's Triangle example to an R source-code block.=C2=A0 The gist o= f 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.string= s, >> : line 1 did not have 5 elements > > Enter a frame number, or 0 to exit=C2=A0=C2=A0=20 > > 1: read.table("/tmp/babel-3780tje/R-import-3780Akj", header =3D FALSE, ro= w.names > =3D NULL, sep =3D " >>>>>>> > > If I construct a table "by hand" with all of the cells occupied, everythi= ng > goes OK.=C2=A0 For instance: > > <<<<<< > #+TBLNAME: some-junk > | 1 | 0 | 0 | 0 | > | 1 | 1 | 0 | 0 | > | 1 | 2 | 1 | 0 | > | 1 | 3 | 3 | 1 |=20 > > #+NAME: read-some-junk(sj_input=3Dsome-junk) > #+BEGIN_SRC R > > rowSums(sj_input) > > #+END_SRC=C2=A0=20 > > #+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=3D5 :exports none :return pascals_triangle(5) > def pascals_triangle(n): > =C2=A0=C2=A0=C2=A0 if n =3D=3D 0: > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return [[1]] > =C2=A0=C2=A0=C2=A0 prev_triangle =3D pascals_triangle(n-1) > =C2=A0=C2=A0=C2=A0 prev_row =3D prev_triangle[n-1] > =C2=A0=C2=A0=C2=A0 this_row =3D map(sum, zip([0] + prev_row, prev_row + [= 0])) > =C2=A0=C2=A0=C2=A0 return prev_triangle + [this_row] > > pascals_triangle(n) > #+end_src A few things are wrong at this point. It seems the JSS article has an error in the header of the pascals_triangle source block. AFAIK there is no header argument :return. I don't know how :return pascals_triangle(5) got there, but am fairly certain it shouldn't be. Second is the last line of the source block. It should read:=20 return pascals_triangle(n) Third, in the JSS article the name of the source code block is pascals-triangle, to distinguish it from the name of the python function pascals_triangle (note the underscore in place of the hyphen).=20 So, with these changes made, I have this, which works for me: #+name: pascals-triangle #+begin_src python :var n=3D5 :exports none=20 def pascals_triangle(n): if n =3D=3D 0: return [[1]] prev_triangle =3D pascals_triangle(n-1) prev_row =3D prev_triangle[n-1] this_row =3D map(sum, zip([0] + prev_row, prev_row + [0])) return prev_triangle + [this_row] return 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 | #+CALL: pascals-triangle(5) #+RESULTS: pascals-triangle(5) | 1 | | | | | | | 1 | 1 | | | | | | 1 | 2 | 1 | | | | | 1 | 3 | 3 | 1 | | | | 1 | 4 | 6 | 4 | 1 | | | 1 | 5 | 10 | 10 | 5 | 1 | > > #+RESULTS: pascals_triangle > | 1 |=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0 |= =C2=A0=C2=A0 | > | 1 | 1 |=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0 |=C2=A0=C2= =A0 | > | 1 | 2 |=C2=A0 1 |=C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0 |=C2=A0=C2=A0 | > | 1 | 3 |=C2=A0 3 |=C2=A0 1 |=C2=A0=C2=A0 |=C2=A0=C2=A0 | > | 1 | 4 |=C2=A0 6 |=C2=A0 4 | 1 |=C2=A0=C2=A0 | > | 1 | 5 | 10 | 10 | 5 | 1 | > > #+name: pst-checkR(pas_inputs=3Dpascals_triangle) > #+BEGIN_SRC R > > rowSums(pas_inputs) > > #+END_SRC I vaguely remember that it once was possible to pass variables in through the name line, but I couldn't find this syntax in some fairly recent documentation. It does appear to work still using a recent Org-mode. If I rename the results and then pass that to the source code block, all is well. #+RESULTS: pascals-tri | 1 | | | | | | | 1 | 1 | | | | | | 1 | 2 | 1 | | | | | 1 | 3 | 3 | 1 | | | | 1 | 4 | 6 | 4 | 1 | | | 1 | 5 | 10 | 10 | 5 | 1 | =20=20 #+name: pst-checkR(p=3Dpascals-tri) #+BEGIN_SRC R p #+END_SRC #+RESULTS: pst-checkR | 1 | nil | nil | nil | nil | nil | | 1 | 1 | nil | nil | nil | nil | | 1 | 2 | 1 | nil | nil | nil | | 1 | 3 | 3 | 1 | nil | nil | | 1 | 4 | 6 | 4 | 1 | nil | | 1 | 5 | 10 | 10 | 5 | 1 | This looks like a bug to me, but Eric S. will know better what might be going on. I can't do much more than this, but I'm optimistic things will be sorted out before your turn to speak at the seminar rolls around. Thanks for bringing the error in the JSS article to light. All the best, Tom >>>>>>> > > Note that I don't really want to do rowSums in this case.=C2=A0 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 trea= ting > the source data as a table, i.e., in the context of Babel source blocks -= - R > is "happy" to read a lower-diagonal structure.=C2=A0 See the appendix for= an > example. > > Any suggestions?=C2=A0 Note that I'm happy to acknowledge that my own ign= orance of > R and/or Babel might be the source of the problem.=C2=A0 If so, please en= lighten > 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"=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "1 1"=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 "1 2 1"=C2=A0=C2=A0=C2=A0=C2=A0 "1 3 3 1"=C2=A0=C2= =A0 "1 4 6 4 1" >> str(x) > =C2=A0chr [1:5] "1" "1 1" "1 2 1" "1 3 3 1" "1 4 6 4 1" >>=20 >> y <- scan("pascal.dat") > Read 15 items >> y > =C2=A0[1] 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 >> str(y) > =C2=A0num [1:15] 1 1 1 1 2 1 1 3 3 1 ... >>=20 >> z <- read.table("pascal.dat", header=3DFALSE) > Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings= ,=C2=A0 :=20 > =C2=A0 line 1 did not have 5 elements > Calls: read.table -> scan > Execution halted > > --=20 Thomas S. Dye http://www.tsdye.com