From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rainer M Krug Subject: Re: [PATCH] -for review- Tangling with variable transfer of variables Date: Mon, 23 Jun 2014 12:45:32 +0200 Message-ID: References: <87zjh8bo8s.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:46943) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz1l1-0003vP-Cf for emacs-orgmode@gnu.org; Mon, 23 Jun 2014 06:45:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wz1kw-0006hf-0g for emacs-orgmode@gnu.org; Mon, 23 Jun 2014 06:45:51 -0400 Received: from mail-wi0-f170.google.com ([209.85.212.170]:53162) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz1kv-0006hJ-NM for emacs-orgmode@gnu.org; Mon, 23 Jun 2014 06:45:45 -0400 Received: by mail-wi0-f170.google.com with SMTP id cc10so4033110wib.5 for ; Mon, 23 Jun 2014 03:45:44 -0700 (PDT) In-Reply-To: (Charles C. Berry's message of "Sat, 21 Jun 2014 12:44:01 -0700") 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: "Charles C. Berry" Cc: emacs-orgmode@gnu.org, Eric Schulte --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable "Charles C. Berry" writes: V> On Fri, 20 Jun 2014, Rainer M Krug wrote: > >> Attached please find =3Dthe reworked patch. >> >> 1) uses local() and closes connection >> 2) does not leave a variable cal;led file behind >> > > Seems to work on a few test cases. > > I'd move the strings to defconsts. > > Putting a newline before each `%S' will outdent the first line of=20 > :var value when it is echoed in the session log so it will be easier to=20 > view. > > =3D=3D=3D > > With Eric's input on this: > > Would you also change this at the end of org-babel-R-assign-elisp: > > res})" name file header row-names max)))) > - (format "%s <- %s" name (org-babel-R-quote-tsv-field value)))) > + (format "%s <- %S" name > + (if (stringp value) value (prin1-to-string value))))) > > ?? > > I think this is innocuous for plain strings with no internal quotes, but= =20 > allows almost anything to be passed to R as a string. > > So > :var x=3D[1 2 3 "4" 5] > > will be passed to R as x <- "[1 2 3 \"4\" 5]" > > instead of x <- "[1 2 3 "4" 5] which throws an error. > > And this just works: > > #+NAME: latex-capt > #+BEGIN_SRC latex > \begin{math} > y =3D X\beta, > \mbox{where } \beta =3D %beta% > \end{math} > #+END_SRC > > #+BEGIN_SRC R :var ytxt=3Dlatex-capt :results raw :wrap latex > beta <- 1.234 > sub("%beta%",beta,ytxt) > #+END_SRC OK - attached please find two patches: 0001-lisp-ob-R.el-Fix-tangling-with-tables.patch 0002-Make-transfer-of-values-from-R-type-aware.patch The first one fixes tangling with tables including discussed suggestions, the second one moves the definition of the R code into defconst and introduces type awareness for the transfer of *values*, but not tables. I reworked your suggestion and now integer are transferred to R as integers (L) and float as double. This already worked for tables. Could you please check the second patch? In my checks everything worked as expected. Cheers, Rainer > > > HTH, > > Chuck =2D-=20 Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation Biology,= UCT), Dipl. Phys. (Germany) Centre of Excellence for Invasion Biology Stellenbosch University South Africa Tel : +33 - (0)9 53 10 27 44 Cell: +33 - (0)6 85 62 59 98 Fax : +33 - (0)9 58 10 27 44 Fax (D): +49 - (0)3 21 21 25 22 44 email: Rainer@krugs.de Skype: RMkrug PGP: 0x0F52F982 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-lisp-ob-R.el-Fix-tangling-with-tables.patch Content-Transfer-Encoding: quoted-printable From=2038c029b38c85d9f9d35d0867b332eebc3daf1aca Mon Sep 17 00:00:00 2001 From: "Rainer M. Krug" Date: Fri, 20 Jun 2014 22:19:59 +0200 Subject: [PATCH 1/2] lisp/ob-R.el: Fix tangling with tables * lisp/ob-R.el (org-babel-R-assign-elisp): Fix variable transfer of tables by using text connections in R instead of files. Variable transfer of tables does not depend on files anymore, i.e. works also when tangling. =2D-- lisp/ob-R.el | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index a3ae1ec..c77a103 100644 =2D-- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -190,32 +190,44 @@ This function is called by `org-babel-execute-src-blo= ck'." (if (listp value) (let* ((lengths (mapcar 'length (org-remove-if-not 'sequencep value)= )) (max (if lengths (apply 'max lengths) 0)) =2D (min (if lengths (apply 'min lengths) 0)) =2D (transition-file (org-babel-temp-file "R-import-"))) + (min (if lengths (apply 'min lengths) 0))) ;; Ensure VALUE has an orgtbl structure (depth of at least 2). (unless (listp (car value)) (setq value (list value))) =2D (with-temp-file transition-file =2D (insert =2D (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field)) =2D "\n")) =2D (let ((file (org-babel-process-file-name transition-file 'noquote)) + (let ((file (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field))) (header (if (or (eq (nth 1 value) 'hline) colnames-p) "TRUE" "FALSE")) (row-names (if rownames-p "1" "NULL"))) (if (=3D max min) =2D (format "%s <- read.table(\"%s\", =2D header=3D%s, =2D row.names=3D%s, =2D sep=3D\"\\t\", =2D as.is=3DTRUE)" name file header row-names) =2D (format "%s <- read.table(\"%s\", =2D header=3D%s, =2D row.names=3D%s, =2D sep=3D\"\\t\", =2D as.is=3DTRUE, =2D fill=3DTRUE, =2D col.names =3D paste(\"V\", seq_len(%d), sep =3D\"\"))" =2D name file header row-names max)))) + (format "%s <- local({ + con <- textConnection( + %S + ) + res <- read.table( + con, + header =3D %s, + row.names =3D %s, + sep =3D \"\\t\", + as.is =3D TRUE + ) + close(con) + res + })" name file header row-names) + (format "%s <- local({ + con <- textConnection( + %S + ) + res <- read.table( + con, + header =3D %s, + row.names =3D %s, + sep =3D \"\\t\", + as.is =3D TRUE, + fill =3D TRUE, + col.names =3D paste(\"V\", seq_len(%d), sep =3D\"= \") + ) + close(con) + res + })" name file header row-names max)))) (format "%s <- %s" name (org-babel-R-quote-tsv-field value)))) =20 (defvar ess-ask-for-ess-directory) ; dynamically scoped =2D-=20 2.0.0 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-Make-transfer-of-values-from-R-type-aware.patch Content-Transfer-Encoding: quoted-printable From=20e62a75e7227027c406d23fa9f8ac594db2ce81d6 Mon Sep 17 00:00:00 2001 From: "Rainer M. Krug" Date: Mon, 23 Jun 2014 12:11:59 +0200 Subject: [PATCH 2/2] Make transfer of values from R type aware * lisp/ob-R.el (org-babel-R-assign-elisp): Added different cases for transfer of integer, float, string and other variables to R so that now integer values are transferred as integers (L) and stored in R as such. This change is backward compatible as integer values are numerical values in R. Moved definition of R functions for transfer of tables into defconst ob-R-transfer-variable-table-with-header and ob-R-transfer-variable-table-without-header. =2D-- lisp/ob-R.el | 78 ++++++++++++++++++++++++++++++++++++--------------------= ---- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index c77a103..92c1dbc 100644 =2D-- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -93,6 +93,44 @@ this variable.") (when (and session (string-match "^\\*\\(.+?\\)\\*$" session)) (save-match-data (org-babel-R-initiate-session session nil))))) =20 +(defconst ob-R-transfer-variable-table-with-header + "%s <- local({ + con <- textConnection( + %S + ) + res <- read.table( + con, + header =3D %s, + row.names =3D %s, + sep =3D \"\\t\", + as.is =3D TRUE + ) + close(con) + res + })" + "R code used to transfer a table defined as a variable from org to R.=20 +This function is used when the table contains a header.") + +(defconst ob-R-transfer-variable-table-without-header + "%s <- local({ + con <- textConnection( + %S + ) + res <- read.table( + con, + header =3D %s, + row.names =3D %s, + sep =3D \"\\t\", + as.is =3D TRUE, + fill =3D TRUE, + col.names =3D paste(\"V\", seq_len(%d), sep =3D\"\") + ) + close(con) + res + })" + "R code used to transfer a table defined as a variable from org to R.=20 +This function is used when the table does not contain a header.") + (defun org-babel-expand-body:R (body params &optional graphics-file) "Expand BODY according to PARAMS, return the expanded body." (mapconcat 'identity @@ -198,37 +236,15 @@ This function is called by `org-babel-execute-src-blo= ck'." "TRUE" "FALSE")) (row-names (if rownames-p "1" "NULL"))) (if (=3D max min) =2D (format "%s <- local({ =2D con <- textConnection( =2D %S =2D ) =2D res <- read.table( =2D con, =2D header =3D %s, =2D row.names =3D %s, =2D sep =3D \"\\t\", =2D as.is =3D TRUE =2D ) =2D close(con) =2D res =2D })" name file header row-names) =2D (format "%s <- local({ =2D con <- textConnection( =2D %S =2D ) =2D res <- read.table( =2D con, =2D header =3D %s, =2D row.names =3D %s, =2D sep =3D \"\\t\", =2D as.is =3D TRUE, =2D fill =3D TRUE, =2D col.names =3D paste(\"V\", seq_len(%d), sep =3D= \"\") =2D ) =2D close(con) =2D res =2D })" name file header row-names max)))) =2D (format "%s <- %s" name (org-babel-R-quote-tsv-field value)))) + (format ob-R-transfer-variable-table-with-header + name file header row-names) + (format ob-R-transfer-variable-table-without-header + name file header row-names max)))) + (if (integerp value) (format "%s <- %s" name (concat (number-to-string= value) "L")) + (if (floatp value) (format "%s <- %s" name value) + (if (stringp value) (format "%s <- %S" name value)=20 + (format "%s <- %S" name (prin1-to-string value))))))) + =20 (defvar ess-ask-for-ess-directory) ; dynamically scoped (defun org-babel-R-initiate-session (session params) =2D-=20 2.0.0 --=-=-=-- --==-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.22 (Darwin) iQEcBAEBAgAGBQJTqAVVAAoJENvXNx4PUvmCLQAIAJfjpv0JFOdX8Kz/JE2WhQ8+ FA0fGCtjBTtLRhWrAiSUrdHbTdSPDFtvFl01s1RUfRUL29mlE+/pXijIFvUfGgnc dFNqGBDYNO/NTByIG6UXbctueZFCgbYSg4yWm05pp6bKAuusHKXdA8+7QAnWOKwy L3qbYgByFdewC0thpyuh5oiJp8SwuDuzsec9/PDNBqH7naLICMknTajEJ54SasSO tj4aDVqrEGaMGQNJ/QNQLLpjmk5ucA2cNOA5CRJrjKMo8JMhoBtsH6LdY723v1nq 41xhPy/0rmrWhZ4nV9BnRPQmVKMuo1y2jTixn3j+EqAvJx0Ji/zJEDGoz1z+134= =AFbf -----END PGP SIGNATURE----- --==-=-=--