2012-02-09 6 views
8

Когда я передаю аргументы блоку #+begin_src, существует ли способ их динамического вычисления?Динамическое вычисление значений аргументов

В частности, я хочу, чтобы установить атрибут :height к чему-то, что зависит от некоторых переменных в моем R коде, как в следующем макете:

#+begin_src R 
x <- 5 
#+end_src 

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

, где это getvar() вещь, и вычисления с ними, это может быть, мой желаемое за действительное.

ответ

1

Org-режим в настоящее время интерпретирует скобки в спецификации заголовков как Elisp, так что вы можете сделать это с некоторым Elisp в возрасте:

Названный Src блока R

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

#+results: default-height 
: 300 

Сделать результат R Emacs переменной

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

Использования Elisp в блоке источник заголовке

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

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

работает для меня :)

+0

Высокого, спасибо, показывая, что , По какой-то причине, хотя мои языки org-babel-load-languages ​​установлены на '((emacs-lisp. T) (sh. T) (plantuml. T) (R. T) (perl. T)) ', Я никогда не мог использовать блоки' emacs-lisp'. –

+0

Какая ошибка с блоками emacs-lisp? Языки org-babel-load-языки выглядят нормально. Возможно, вы сможете протолкнуть промежуточный код elisp, вы можете решить, как ссылаться на результат R, который вы хотите использовать (по умолчанию - высота в моем примере выше), непосредственно как код elisp. –

2

Я не знаю, как использовать org-mode для этого, но это уже функция в пакете knitr (альтернатива Sweave), поэтому, если вы не против синтаксиса Sweave, вы можете использовать:

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

Подробнее о орг-режиме в knitr: http://yihui.name/knitr/demo/org/

Смежные вопросы