mirror of
https://github.com/foo-dogsquared/wiki.git
synced 2025-01-31 04:58:21 +00:00
aea7015cd5
Apparently, the convention (at least starting from 2018) is to make the keywords and block names to be in lowercase as stated from one of the following discussions at https://orgmode.org/list/87tuuw3n15.fsf@nicolasgoaziou.fr/. The files was updated with a one liner of shell. However, this is Emacs and org-mode does have an API to let you do stuff in your config and interact with the documents internally so it is not an elegant solution in any way.
159 lines
4.7 KiB
Org Mode
159 lines
4.7 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: "2020-09-19 17:53:44 +08:00"
|
|
#+language: en
|
|
#+options: toc:t
|
|
#+properties: header-args :session :exports both
|
|
#+roam_tags: reproducible-research
|
|
|
|
|
|
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 wooosh.png
|
|
unset arrow
|
|
unset label
|
|
set grid
|
|
splot x**2+y**2, x**2-y**2
|
|
#+end_src
|
|
|
|
#+results:
|
|
|
|
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 threeeeeeD.png
|
|
set title "3D gnuplot demo"
|
|
unset grid
|
|
splot x*y with points
|
|
#+end_src
|
|
|
|
#+results:
|
|
[[file:threeeeeeD.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
|