mirror of
https://github.com/foo-dogsquared/wiki.git
synced 2025-01-31 04:58:21 +00:00
159 lines
4.9 KiB
Org Mode
159 lines
4.9 KiB
Org Mode
#+title: Org-mode: Babel
|
|
#+author: "Gabriel Arazas"
|
|
#+email: "foo.dogsquared@gmail.com"
|
|
#+date: "2020-04-17 21:41:30 +08:00"
|
|
#+date_modified: "2021-04-15 21:07:18 +08:00"
|
|
#+language: en
|
|
#+properties: header-args :session :exports both
|
|
#+tags: research.reproducibility
|
|
|
|
|
|
Org-babel is the framework that enables [[file:2020-04-20-16-51-40.org][Org-mode]] to insert output of the code from programming languages.
|
|
It is also the one thing that makes Org-mode to be used as a tool for [[file:2020-04-12-11-20-53.org][Reproducible research]].
|
|
As of 2020-06-08, [[https://orgmode.org/worg/org-contrib/babel/languages.html][Babel supports more than 50 languages]] with the possibility of adding of other languages that are not supported yet.
|
|
|
|
|
|
|
|
|
|
* The fundamental concepts
|
|
|
|
Here's an example of a code block executed with the shell.
|
|
|
|
#+begin_src sh
|
|
echo "HELLO WORLD"
|
|
#+end_src
|
|
|
|
#+results:
|
|
: HELLO WORLD
|
|
|
|
To execute the code block, simply run ~org-babel-execute-src-block~ (by default, this is mapped in ~<C-c> <C-c>~).
|
|
The results will be printed into a result block.
|
|
|
|
Each of the supported language may also have an exclusive option with each language suitable for certain processes.
|
|
|
|
For example, with Python 3, you can pretty print it in accordance to Org-mode display.
|
|
An array will create a table, for instance with ~:results value~ [[https://orgmode.org/manual/Using-Header-Arguments.html#Using-Header-Arguments][header argument]].
|
|
|
|
#+begin_src python :results value
|
|
[["Item", "Value"], ["Baseball bat", 123], ["Baseball glove", 25], ["Printed shirt", 42]]
|
|
#+end_src
|
|
|
|
#+results:
|
|
: None
|
|
|
|
You can also export graphics with tools such as [[http://gnuplot.info/][Gnuplot]], [[https://www.gnu.org/software/octave/][GNU Octave]], [[https://www.r-project.org/][R]], and even [[https://www.latex-project.org/][LaTeX]].
|
|
With it, you can export the graphics into a file (commonly with ~:file <PATH>~).
|
|
|
|
#+begin_src gnuplot :exports both :file assets/2020-04-17-21-41-30/gnuplot-demo.png
|
|
unset arrow
|
|
unset label
|
|
set grid
|
|
splot x**2+y**2, x**2-y**2
|
|
#+end_src
|
|
|
|
#+results:
|
|
[[file:assets/2020-04-17-21-41-30/gnuplot-demo.png]]
|
|
|
|
With Org-babel, you can share either the output, the code used to generate the output, or both.
|
|
This is commonly set with the ~:exports~ header argument.
|
|
[fn:: Again, this varies whether export options are available for each Babel-supported lanaguages.]
|
|
|
|
Here's an example where I decided to show only the output with ~:exports results~.
|
|
|
|
#+begin_src gnuplot :exports results :file assets/2020-04-17-21-41-30/gnuplot-3d-demo.png
|
|
set title "3D gnuplot demo"
|
|
unset grid
|
|
splot x*y with points
|
|
#+end_src
|
|
|
|
#+results:
|
|
[[file:assets/2020-04-17-21-41-30/gnuplot-3d-demo.png]]
|
|
|
|
|
|
|
|
|
|
* Sessions
|
|
|
|
Each of the source code block runs on an individual session.
|
|
However, you can connect source code blocks (with the supported languages) in the same session with ~:session <SESSION NAME>~.
|
|
|
|
Let's start with a simple example where we want to demonstrate some Python shenanigans.
|
|
Here's one Python code block.
|
|
|
|
#+begin_src python :results output :session python-example
|
|
x = 35
|
|
print(x)
|
|
#+end_src
|
|
|
|
#+results:
|
|
: 35
|
|
|
|
Then here's another code block in the same session.
|
|
|
|
#+begin_src python :results output :session python-example
|
|
for i in range(5):
|
|
x += 5
|
|
print(x)
|
|
#+end_src
|
|
|
|
#+results:
|
|
: 40
|
|
: 45
|
|
: 50
|
|
: 55
|
|
: 60
|
|
|
|
In certain code where the output can still change (for example, try executing the previous code block again), this may not be the desired behavior.
|
|
To correct this, simply execute ~org-babel-execute-buffer~.
|
|
|
|
|
|
|
|
|
|
* Integrating between different programming languages
|
|
|
|
You can also pass Org-mode variables (from ~#+NAME: <VAR>~) [fn:: Technically called an internal link (https://orgmode.org/org.html#Internal-Links).] into the source code blocks with the ~:var <NAMEC>=<DATA>~ (though, this may vary among Babel runtimes).
|
|
|
|
#+name: example_string
|
|
This is the string.
|
|
|
|
#+begin_src python :var example=example_string :results value
|
|
example
|
|
#+end_src
|
|
|
|
#+results:
|
|
: None
|
|
|
|
This is the source code from the document, for reference.
|
|
|
|
#+begin_src org :exports code :results silent
|
|
,#+NAME: example_string
|
|
This is the string.
|
|
|
|
,#+BEGIN_SRC python :var example=example_string :outputs value
|
|
example
|
|
,#+END_SRC
|
|
|
|
,#+RESULTS:
|
|
,: This is the string.
|
|
#+end_src
|
|
|
|
Org-mode variables does capture an element as its input.
|
|
This has a lot of implications of passing data between different sessions and even different languages.
|
|
|
|
For example, we could still capture the ~x~ variable from the previous Python code blocks.
|
|
|
|
#+name: var_from_other_lang
|
|
#+begin_src python :results silent :session python-example :exports value
|
|
x # Which should be 60 at this point.
|
|
#+end_src
|
|
|
|
Then, pass it to some other Org-mode blocks with the variable.
|
|
(Since the captured variable are always going to be a string, we have to convert it into the appropriate type.)
|
|
|
|
#+begin_src R :results output :var python_var=var_from_other_lang
|
|
as.numeric(python_var) + 2
|
|
#+end_src
|
|
|
|
#+results:
|
|
: [1] 62
|