2012-02-09 16 views
8

Cuando paso argumentos a un bloque #+begin_src, ¿hay alguna forma de calcularlos dinámicamente?Calcular los valores de argumento dinámicamente

Específicamente, quiero establecer el atributo :height a algo que depende de algunas variables en mi código R, como en el siguiente maqueta:

#+begin_src R 
x <- 5 
#+end_src 

#+begin_src R :results graphics :file foo.svg :height (3*getvar('x')) 
...draw picture here 
#+end_src 

en que getvar() cosa, y los cálculos con la misma, es tal vez mi ilusión.

Respuesta

1

modo Org ahora interpreta paréntesis en las especificaciones de cabecera como elisp lo que puede hacer esto con un poco de elisp en el medio:

bloque src R Named

#+name: default-height 
#+begin_src R 
    x <- 300 
#+end_src 

#+results: default-height 
: 300 

hacer que el resultado de una variable R emacs

#+begin_src emacs-lisp :var incoming = default-height :results silent 
    (setq dh incoming) 
#+end_src 

El uso de elisp en fuente de cabecera de bloque

#+begin_src R :results graphics :file test.png :height (* dh 3) 
    plot(rnorm(100)) 
#+end_src 

#+results: 
[[file:test.png]] 

funciona para mí :)

+0

impresionantes, gracias por mostrar que . Por alguna razón, aunque mi 'org-babel-load-languages' se establece en' ((emacs-lisp. T) (sh.t) (plantuml. T) (Rt) (perl. T)) ', Nunca he podido hacer funcionar los bloques' emacs-lisp'. –

+0

¿Cuál es el error con los bloques de emacs-lisp? org-babel-load-languages ​​parece estar bien. Es posible que pueda deshacerse del código elisp intermedio, ya que puede resolver cómo hacer referencia al resultado R que desea usar (altura predeterminada en mi ejemplo anterior) directamente como código elisp. –

2

No sé cómo usar org-mode para hacer eso, pero esto ya es una característica en el paquete knitr (una alternativa a Sweave), así que si no te importa la sintaxis Sweave, puedes usar:

<<>>= 
x <- 5 
<<foo, dev='svg', fig.height=3*x>>= 
# draw plots here 
@ 

Más de org-mode en knitr: http://yihui.name/knitr/demo/org/

Cuestiones relacionadas