emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [PATCH] babel: add a :rownames argument to R code blocks
@ 2010-03-24 23:11 Julien Barnier
  2010-03-25 13:39 ` Eric Schulte
  0 siblings, 1 reply; 3+ messages in thread
From: Julien Barnier @ 2010-03-24 23:11 UTC (permalink / raw)
  To: emacs-orgmode

Hi,

The following simple patch add a :rownames argument to R source code
blocks in org-babel. With :rownames yes it allows to export the row
names when the result is a table.

For example :

#+BEGIN_SRC R :session :colnames yes :rownames yes
table(d$sexe,d$cuisine)
#+END_SRC

#+results:
|       | Non | Oui |
|-------+-----+-----|
| Homme |   2 |   2 |
| Femme |   4 |   2 |

Thanks a lot for all your work !

Julien

---
 contrib/babel/lisp/langs/org-babel-R.el |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/contrib/babel/lisp/langs/org-babel-R.el b/contrib/babel/lisp/langs/org-babel-R.el
index a8071b2..f0d79b9 100644
--- a/contrib/babel/lisp/langs/org-babel-R.el
+++ b/contrib/babel/lisp/langs/org-babel-R.el
@@ -46,6 +46,8 @@ called by `org-babel-execute-src-block'."
            (vars (second processed-params))
 	   (column-names-p (and (cdr (assoc :colnames params))
 				(string= "yes" (cdr (assoc :colnames params)))))
+	   (row-names-p (and (cdr (assoc :rownames params))
+				(string= "yes" (cdr (assoc :rownames params)))))
 	   (out-file (cdr (assoc :file params)))
 	   (augmented-body
 	    (concat
@@ -53,7 +55,7 @@ called by `org-babel-execute-src-block'."
 	     (mapconcat ;; define any variables
 	      (lambda (pair) (org-babel-R-assign-elisp (car pair) (cdr pair))) vars "\n")
 	     "\n" body "\n" (if out-file "dev.off()\n" "")))
-	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p)))
+	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p row-names-p)))
       (or out-file result))))
 
 (defun org-babel-prep-session:R (session params)
@@ -133,9 +135,9 @@ called by `org-babel-execute-src-block'."
 (defvar org-babel-R-eoe-indicator "'org_babel_R_eoe'")
 (defvar org-babel-R-eoe-output "[1] \"org_babel_R_eoe\"")
 (defvar org-babel-R-wrapper-method "main <- function ()\n{\n%s\n}
-write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)")
+write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)")
 
-(defun org-babel-R-evaluate (session body result-type column-names-p)
+(defun org-babel-R-evaluate (session body result-type column-names-p row-names-p)
   "Pass BODY to the R process in SESSION.  If RESULT-TYPE equals
 'output then return a list of the outputs of the statements in
 BODY, if RESULT-TYPE equals 'value then return the value of the
@@ -153,7 +155,7 @@ last statement in BODY, as elisp."
 		(stderr
 		 (with-temp-buffer
 		   (insert (format org-babel-R-wrapper-method
-				   body tmp-file (if column-names-p "TRUE" "FALSE")))
+				   body tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p (if row-names-p "NA" "TRUE") "FALSE")))
 		   (setq exit-code (org-babel-shell-command-on-region
 				    (point-min) (point-max) "R --no-save" nil 'replace (current-buffer)))
 		   (buffer-string))))
@@ -168,7 +170,7 @@ last statement in BODY, as elisp."
 	      (case result-type
 		(value
 		 (mapconcat #'org-babel-chomp (list body
-						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)" tmp-file (if column-names-p "TRUE" "FALSE"))
+						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)" tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p  (if row-names-p "NA" "TRUE") "FALSE"))
 						    org-babel-R-eoe-indicator) "\n"))
 		(output
 		 (mapconcat #'org-babel-chomp (list body org-babel-R-eoe-indicator) "\n"))))
-- 
1.7.0.3

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

* Re: [PATCH] babel: add a :rownames argument to R code blocks
  2010-03-24 23:11 [PATCH] babel: add a :rownames argument to R code blocks Julien Barnier
@ 2010-03-25 13:39 ` Eric Schulte
  2010-03-25 15:40   ` Dan Davison
  0 siblings, 1 reply; 3+ messages in thread
From: Eric Schulte @ 2010-03-25 13:39 UTC (permalink / raw)
  To: Julien Barnier; +Cc: emacs-orgmode

Hi Julien,

Thanks for the patch, however it looks like the attached patch breaks
columnname support for R source code blocks.  I'm pasting in the
relevant portion of our test suite, from the development.org file in our
development repository [1].  Could you please sort this issue out before
we apply the patch?

Thanks -- Eric

relevant test... the final source block should return 169

#+tblname: test-table-colnames
| var1 | var2 | var3 |
|------+------+------|
|    1 |   22 |   13 |
|   41 |   55 |   67 |

#+srcname: R-square(x=default-name-doesnt-exist)
#+begin_src R :colnames yes
x^2
#+end_src

This should return 169. The fact that R is able to use the column name
to index the data frame (x$var3) proves that a table with column names
(a header row) has been recognised as input for the R-square function
block, and that the R-square block has output an elisp table with
column names, and that the colnames have again been recognised when
creating the R variables in this block.
#+srcname: table-R-colnames-org(x = R-square(x=test-table-colnames))
#+begin_src R
x$var3[1]
#+end_src


Julien Barnier <julien@no-log.org> writes:

> Hi,
>
> The following simple patch add a :rownames argument to R source code
> blocks in org-babel. With :rownames yes it allows to export the row
> names when the result is a table.
>
> For example :
>
> #+BEGIN_SRC R :session :colnames yes :rownames yes
> table(d$sexe,d$cuisine)
> #+END_SRC
>
> #+results:
> |       | Non | Oui |
> |-------+-----+-----|
> | Homme |   2 |   2 |
> | Femme |   4 |   2 |
>
> Thanks a lot for all your work !
>
> Julien
>
> ---
>  contrib/babel/lisp/langs/org-babel-R.el |   12 +++++++-----
>  1 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/contrib/babel/lisp/langs/org-babel-R.el b/contrib/babel/lisp/langs/org-babel-R.el
> index a8071b2..f0d79b9 100644
> --- a/contrib/babel/lisp/langs/org-babel-R.el
> +++ b/contrib/babel/lisp/langs/org-babel-R.el
> @@ -46,6 +46,8 @@ called by `org-babel-execute-src-block'."
>             (vars (second processed-params))
>  	   (column-names-p (and (cdr (assoc :colnames params))
>  				(string= "yes" (cdr (assoc :colnames params)))))
> +	   (row-names-p (and (cdr (assoc :rownames params))
> +				(string= "yes" (cdr (assoc :rownames params)))))
>  	   (out-file (cdr (assoc :file params)))
>  	   (augmented-body
>  	    (concat
> @@ -53,7 +55,7 @@ called by `org-babel-execute-src-block'."
>  	     (mapconcat ;; define any variables
>  	      (lambda (pair) (org-babel-R-assign-elisp (car pair) (cdr pair))) vars "\n")
>  	     "\n" body "\n" (if out-file "dev.off()\n" "")))
> -	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p)))
> +	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p row-names-p)))
>        (or out-file result))))
>  
>  (defun org-babel-prep-session:R (session params)
> @@ -133,9 +135,9 @@ called by `org-babel-execute-src-block'."
>  (defvar org-babel-R-eoe-indicator "'org_babel_R_eoe'")
>  (defvar org-babel-R-eoe-output "[1] \"org_babel_R_eoe\"")
>  (defvar org-babel-R-wrapper-method "main <- function ()\n{\n%s\n}
> -write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)")
> +write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)")
>  
> -(defun org-babel-R-evaluate (session body result-type column-names-p)
> +(defun org-babel-R-evaluate (session body result-type column-names-p row-names-p)
>    "Pass BODY to the R process in SESSION.  If RESULT-TYPE equals
>  'output then return a list of the outputs of the statements in
>  BODY, if RESULT-TYPE equals 'value then return the value of the
> @@ -153,7 +155,7 @@ last statement in BODY, as elisp."
>  		(stderr
>  		 (with-temp-buffer
>  		   (insert (format org-babel-R-wrapper-method
> -				   body tmp-file (if column-names-p "TRUE" "FALSE")))
> +				   body tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p (if row-names-p "NA" "TRUE") "FALSE")))
>  		   (setq exit-code (org-babel-shell-command-on-region
>  				    (point-min) (point-max) "R --no-save" nil 'replace (current-buffer)))
>  		   (buffer-string))))
> @@ -168,7 +170,7 @@ last statement in BODY, as elisp."
>  	      (case result-type
>  		(value
>  		 (mapconcat #'org-babel-chomp (list body
> -						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)" tmp-file (if column-names-p "TRUE" "FALSE"))
> +						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)" tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p  (if row-names-p "NA" "TRUE") "FALSE"))
>  						    org-babel-R-eoe-indicator) "\n"))
>  		(output
>  		 (mapconcat #'org-babel-chomp (list body org-babel-R-eoe-indicator) "\n"))))

Footnotes: 
[1]  http://eschulte.github.com/babel-dev/

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

* Re: [PATCH] babel: add a :rownames argument to R code blocks
  2010-03-25 13:39 ` Eric Schulte
@ 2010-03-25 15:40   ` Dan Davison
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Davison @ 2010-03-25 15:40 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode, Julien Barnier

[-- Attachment #1: Type: text/plain, Size: 1236 bytes --]

"Eric Schulte" <schulte.eric@gmail.com> writes:

> Hi Julien,
>
> Thanks for the patch, however it looks like the attached patch breaks
> columnname support for R source code blocks.  I'm pasting in the
> relevant portion of our test suite, from the development.org file in our
> development repository [1].  Could you please sort this issue out before
> we apply the patch?

Hi Julien,

Thanks for the patch and for raising this issue. It's been something
I've wanted to sort out for a while.

I'm attaching a rushed-together org file containing some test examples
for colnames and rownames. I think it shows a couple of problems with
your patch, but I had to do this quickly so sorry if I'm mistaken.

Before we finalise the behaviour, I'd like us to be clear about the
following issues:

1. When we say ':rownames yes', are we
   1. Declaring that the input has rownames?
   2. Declaring that we want the output to have rownames?
   3. Both?
2. Same as (1) but for colnames

I've added the test file to our devel repo at 
http://github.com/eschulte/babel-dev/
please contact either of us offline for access to the repo.

Could we use this org file as the basis for settling on final
colnames/rownames behaviour in org-babel-R?

Dan


[-- Attachment #2: col-row-names.org --]
[-- Type: text/plain, Size: 2560 bytes --]

#+title: Column and row names

* Tables
#+tblname: A
| row1 |   11 |   12 |
| row2 |   21 |   22 |

#+tblname: B
|      | col1 | col2 |
|------+------+------|
| row1 |   11 |   12 |
| row2 |   21 |   22 |


* Current behaviour
*** OK Simple identity
#+begin_src R :var tab=A
  tab
#+end_src

#+results:
| row1 | 11 | 12 |
| row2 | 21 | 22 |

*** OK Use org header line
#+begin_src R :var tab=B :colnames yes
tab
#+end_src

The X comes from R providing a default name for a missing column name

#+results:
| X    | col1 | col2 |
|------+------+------|
| row1 |   11 |   12 |
| row2 |   21 |   22 |

*** Create rownames in R
***** Simple
#+begin_src R :var tab=B
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

***** OK With colnames
      
#+begin_src R :var tab=B :colnames yes
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| a | b | c |
|---+---+---|
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

* New behaviour
*** OK Simple identity
#+begin_src R :var tab=A
tab
#+end_src

#+results:
| row1 | 11 | 12 |
| row2 | 21 | 22 |

*** TODO Use org header line
    Header line from org table is not used.
#+begin_src R :var tab=B :colnames yes
tab
#+end_src

#+results:
| row1 | 11 | 12 |
|------+----+----|
| row2 | 21 | 22 |

*** OK Use org header line with 'rownames yes'
#+begin_src R :var tab=B :colnames yes :rownames yes
tab
#+end_src

#+results:
| X    | col1 | col2 |
|------+------+------|
| row1 |   11 |   12 |
| row2 |   21 |   22 |

*** TODO Create rownames in R
***** Simple
#+begin_src R :var tab=B
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

***** TODO With colnames
      Inappropriate colnames
#+begin_src R :var tab=B :colnames yes
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| 1 | 4 | 7 |
|---+---+---|
| 2 | 5 | 8 |
| 3 | 6 | 9 |

***** TODO With rownames
      Gets colnames but not rownames

#+begin_src R :var tab=B :rownames yes
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| a | b | c |
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

***** TODO With colnames and rownames
      Doesn't get rownames (?)
#+begin_src R :var tab=B :colnames yes :rownames yes
array(1:9, dim=c(3,3), dimnames=list(letters[1:3], letters[1:3]))
#+end_src

#+results:
| a | b | c |
|---+---+---|
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

* Org config
#+TODO: TODO | OK

[-- Attachment #3: Type: text/plain, Size: 4990 bytes --]




>
> Thanks -- Eric
>
> relevant test... the final source block should return 169
>
> #+tblname: test-table-colnames
> | var1 | var2 | var3 |
> |------+------+------|
> |    1 |   22 |   13 |
> |   41 |   55 |   67 |
>
> #+srcname: R-square(x=default-name-doesnt-exist)
> #+begin_src R :colnames yes
> x^2
> #+end_src
>
> This should return 169. The fact that R is able to use the column name
> to index the data frame (x$var3) proves that a table with column names
> (a header row) has been recognised as input for the R-square function
> block, and that the R-square block has output an elisp table with
> column names, and that the colnames have again been recognised when
> creating the R variables in this block.
> #+srcname: table-R-colnames-org(x = R-square(x=test-table-colnames))
> #+begin_src R
> x$var3[1]
> #+end_src
>
>
> Julien Barnier <julien@no-log.org> writes:
>
>> Hi,
>>
>> The following simple patch add a :rownames argument to R source code
>> blocks in org-babel. With :rownames yes it allows to export the row
>> names when the result is a table.
>>
>> For example :
>>
>> #+BEGIN_SRC R :session :colnames yes :rownames yes
>> table(d$sexe,d$cuisine)
>> #+END_SRC
>>
>> #+results:
>> |       | Non | Oui |
>> |-------+-----+-----|
>> | Homme |   2 |   2 |
>> | Femme |   4 |   2 |
>>
>> Thanks a lot for all your work !
>>
>> Julien
>>
>> ---
>>  contrib/babel/lisp/langs/org-babel-R.el |   12 +++++++-----
>>  1 files changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/contrib/babel/lisp/langs/org-babel-R.el b/contrib/babel/lisp/langs/org-babel-R.el
>> index a8071b2..f0d79b9 100644
>> --- a/contrib/babel/lisp/langs/org-babel-R.el
>> +++ b/contrib/babel/lisp/langs/org-babel-R.el
>> @@ -46,6 +46,8 @@ called by `org-babel-execute-src-block'."
>>             (vars (second processed-params))
>>  	   (column-names-p (and (cdr (assoc :colnames params))
>>  				(string= "yes" (cdr (assoc :colnames params)))))
>> +	   (row-names-p (and (cdr (assoc :rownames params))
>> +				(string= "yes" (cdr (assoc :rownames params)))))
>>  	   (out-file (cdr (assoc :file params)))
>>  	   (augmented-body
>>  	    (concat
>> @@ -53,7 +55,7 @@ called by `org-babel-execute-src-block'."
>>  	     (mapconcat ;; define any variables
>>  	      (lambda (pair) (org-babel-R-assign-elisp (car pair) (cdr pair))) vars "\n")
>>  	     "\n" body "\n" (if out-file "dev.off()\n" "")))
>> -	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p)))
>> +	   (result (org-babel-R-evaluate session augmented-body result-type column-names-p row-names-p)))
>>        (or out-file result))))
>>  
>>  (defun org-babel-prep-session:R (session params)
>> @@ -133,9 +135,9 @@ called by `org-babel-execute-src-block'."
>>  (defvar org-babel-R-eoe-indicator "'org_babel_R_eoe'")
>>  (defvar org-babel-R-eoe-output "[1] \"org_babel_R_eoe\"")
>>  (defvar org-babel-R-wrapper-method "main <- function ()\n{\n%s\n}
>> -write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)")
>> +write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)")
>>  
>> -(defun org-babel-R-evaluate (session body result-type column-names-p)
>> +(defun org-babel-R-evaluate (session body result-type column-names-p row-names-p)
>>    "Pass BODY to the R process in SESSION.  If RESULT-TYPE equals
>>  'output then return a list of the outputs of the statements in
>>  BODY, if RESULT-TYPE equals 'value then return the value of the
>> @@ -153,7 +155,7 @@ last statement in BODY, as elisp."
>>  		(stderr
>>  		 (with-temp-buffer
>>  		   (insert (format org-babel-R-wrapper-method
>> -				   body tmp-file (if column-names-p "TRUE" "FALSE")))
>> +				   body tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p (if row-names-p "NA" "TRUE") "FALSE")))
>>  		   (setq exit-code (org-babel-shell-command-on-region
>>  				    (point-min) (point-max) "R --no-save" nil 'replace (current-buffer)))
>>  		   (buffer-string))))
>> @@ -168,7 +170,7 @@ last statement in BODY, as elisp."
>>  	      (case result-type
>>  		(value
>>  		 (mapconcat #'org-babel-chomp (list body
>> -						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=FALSE, col.names=%s, quote=FALSE)" tmp-file (if column-names-p "TRUE" "FALSE"))
>> +						    (format "write.table(.Last.value, file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names=%s, quote=FALSE)" tmp-file (if row-names-p "TRUE" "FALSE") (if column-names-p  (if row-names-p "NA" "TRUE") "FALSE"))
>>  						    org-babel-R-eoe-indicator) "\n"))
>>  		(output
>>  		 (mapconcat #'org-babel-chomp (list body org-babel-R-eoe-indicator) "\n"))))
>
> Footnotes: 
> [1]  http://eschulte.github.com/babel-dev/
>
>
>
> _______________________________________________
> 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

[-- Attachment #4: Type: text/plain, Size: 201 bytes --]

_______________________________________________
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

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

end of thread, other threads:[~2010-03-25 15:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-24 23:11 [PATCH] babel: add a :rownames argument to R code blocks Julien Barnier
2010-03-25 13:39 ` Eric Schulte
2010-03-25 15:40   ` Dan Davison

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