186 lines
4.1 KiB
Org Mode
186 lines
4.1 KiB
Org Mode
|
#+TITLE: Notes on “Babel: Introduction”
|
||
|
#+AUTHOR: Daniel
|
||
|
#+DATE: 2016-06-26
|
||
|
|
||
|
Tutorial from http://orgmode.org/worg/org-contrib/babel/intro.html
|
||
|
|
||
|
* Source Code Execution
|
||
|
|
||
|
#+begin_src hy
|
||
|
(print "Hello, There!")
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS:
|
||
|
: Hello, There!
|
||
|
|
||
|
#+begin_src sh
|
||
|
echo "This file takes up `du -h emacs-org-babel-tutorial.org | sed 's/\([0-9k]*\)[ ]*emacs-org-babel-tutorial.org/\1/'`"
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS:
|
||
|
: This file takes up 4.0K
|
||
|
|
||
|
#+begin_src R :colnames yes
|
||
|
words <- tolower(scan("emacs-org-babel-tutorial.org", what="", na.strings=c("|",":")))
|
||
|
t(sort(table(words[nchar(words) > 3]), decreasing=TRUE)[1:10])
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS:
|
||
|
| #+begin_src | #+end_src | #+results: | date | plus | today's | :results | hello, | import | is") |
|
||
|
|-------------+-----------+------------+------+------+---------+----------+--------+--------+------|
|
||
|
| 5 | 5 | 4 | 3 | 3 | 3 | 2 | 2 | 2 | 2 |
|
||
|
|
||
|
** Capturing the Results of Code Evaluation
|
||
|
|
||
|
#+begin_src python :results value
|
||
|
import time
|
||
|
print("Hello, today's date is %s" % time.ctime())
|
||
|
print("Two plus two is")
|
||
|
return 2 + 2
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS:
|
||
|
: 4
|
||
|
|
||
|
#+begin_src python :results output
|
||
|
import time
|
||
|
print("Hello, today's date is %s" % time.ctime())
|
||
|
print("Two plus two is")
|
||
|
2 + 2
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS:
|
||
|
: Hello, today's date is Sun Jun 26 16:04:36 2016
|
||
|
: Two plus two is
|
||
|
|
||
|
** Session-based Evaluation
|
||
|
|
||
|
Have a look into /Emacs Speaks Statistics/
|
||
|
|
||
|
** Arguments to Code Blocks
|
||
|
|
||
|
#+name: square
|
||
|
#+header: :var x = 0
|
||
|
#+begin_src python
|
||
|
return x*x
|
||
|
#+end_src
|
||
|
|
||
|
#+call: square(x=6)
|
||
|
|
||
|
#+RESULTS:
|
||
|
: 36
|
||
|
|
||
|
#+tblname: fibonacci-inputs
|
||
|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
||
|
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
|
||
|
|
||
|
#+name: fibonacci-seq
|
||
|
#+begin_src emacs-lisp :var fib-inputs=fibonacci-inputs
|
||
|
(defun fibonacci (n)
|
||
|
(if (or (= n 0) (= n 1))
|
||
|
n
|
||
|
(+ (fibonacci (- n 1))
|
||
|
(fibonacci (- n 2)))))
|
||
|
|
||
|
(mapcar (lambda (row)
|
||
|
(mapcar #'fibonacci row))
|
||
|
fib-inputs)
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: fibonacci-seq
|
||
|
| 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
|
||
|
| 1 | 3 | 8 | 21 | 55 | 144 | 377 | 987 | 2584 | 6765 |
|
||
|
|
||
|
** In-line Code Blocks
|
||
|
|
||
|
In-line code can be call without header arguments (like so: src_sh{date}) or
|
||
|
with header arguments (like so: src_python[:results value]{return 10 + 10}).
|
||
|
|
||
|
** Code Block Body Expansion
|
||
|
|
||
|
Preview: =C-c C-v v=, bound to =org-babel-expand-src-block=
|
||
|
|
||
|
#+tblname: data
|
||
|
| username | john-doe |
|
||
|
| password | abc123 |
|
||
|
|
||
|
#+begin_src emacs-lisp :var data=data
|
||
|
(setq my-special-username (first (first data)))
|
||
|
(setq my-special-password (first (second data)))
|
||
|
#+end_src
|
||
|
|
||
|
** A Meta-programming Language for Org-mode
|
||
|
|
||
|
#+name: directories
|
||
|
#+begin_src sh :results replace
|
||
|
cd ~ && du -sc * | grep -v total
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: directories
|
||
|
| 538604 | Desktop |
|
||
|
| 77332656 | Documents |
|
||
|
| 1206668 | Mail |
|
||
|
| 8 | News |
|
||
|
|
||
|
#+name: directory-pie-chart
|
||
|
#+begin_src R :session R-pie-example :var dirs=directories
|
||
|
pie(dirs[,1], labels = dirs[,2])
|
||
|
#+end_src
|
||
|
|
||
|
#+RESULTS: directory-pie-chart
|
||
|
|
||
|
Note: the syntax =#+name: directory-pie-chart(dirs=directories)= did not work.
|
||
|
|
||
|
** Using Code Blocks in Org Tables
|
||
|
|
||
|
*** Example 1: Data Summaries Using R
|
||
|
|
||
|
#+name: tbl-example-data
|
||
|
#+begin_src R
|
||
|
runif(n=5, min=0, max=1)
|
||
|
#+end_src
|
||
|
|
||
|
#+name: R-mean
|
||
|
#+begin_src R :var x=""
|
||
|
colMeans(x)
|
||
|
#+end_src
|
||
|
|
||
|
#+tblname: summaries
|
||
|
| mean |
|
||
|
|-------------------|
|
||
|
| 0.574235895462334 |
|
||
|
#+TBLFM: @2$1='(org-sbe "R-mean" (x "tbl-example-data()"))
|
||
|
|
||
|
*** Example 2: Babel Test Suite
|
||
|
|
||
|
/No notes/
|
||
|
|
||
|
* The Library of Babel
|
||
|
|
||
|
#+lob: square(x=6)
|
||
|
|
||
|
Does not do what I expected …
|
||
|
|
||
|
* Literate Programming
|
||
|
|
||
|
#+name: hello-world-prefix
|
||
|
#+begin_src sh :exports none
|
||
|
echo "/-----------------------------------------------------------\\"
|
||
|
#+end_src
|
||
|
|
||
|
#+name: hello-world-postfix
|
||
|
#+begin_src sh :exports none
|
||
|
echo "\-----------------------------------------------------------/"
|
||
|
#+end_src
|
||
|
|
||
|
#+name: hello-world
|
||
|
#+begin_src sh :tangle hello.sh :exports none :noweb yes
|
||
|
<<hello-world-prefix>>
|
||
|
echo "| hello world |"
|
||
|
<<hello-world-postfix>>
|
||
|
#+end_src
|
||
|
|
||
|
Tangling with =C-c C-v t=.
|
||
|
|
||
|
* Reproducible Research
|