一句话,计算方面绝对比excel计算功能强。图形方面我还没有用过。对于编程者来讲,用鼠标拖拽操作还是用lisp编写计算公式哪个更符合思考的习惯,我觉得是后者。我这里只介绍lisp计算公式,如果关注简单的Calc计算公式,可以参考官方文档。
推荐写法,@row_index$col_index
可以用C-c } 显示或者隐藏row_index和col_index
比如:
首先将光标定位到要计算的cell,然后可以通过菜单,tbl->calculat->set column formular, 也可以使用组合键: C-u C-c =
然后在mini buffer中输入公式,回车。结果会在表格下面出现公式:
* 测试表格 #+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | |--------+-------+-------+-------| | <6> || | | | / | < | > | | | 2015-05-01 | 10 | 20 | 51 | | 2015-05-04 | 11 | 22 | 68 | | | | | 119 | #+TBLFM: @6$4='(+ @4$4 @5$4);N
C-u C-c * 可以对整个表格重新计算(光标必须停留在表格上), 结果如下:
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | |--------+-------+-------+-------| | <6> || | | | / | < | > | | | 2015-05-01 | 10 | 20 | 50 | | 2015-05-04 | 11 | 22 | 68 | | | | | 118 | #+TBLFM: @6$4='(+ @4$4 @5$4);N
有一种不需要编写公式就可以对某列求和的方式,将光标定位到某个cell,然后按下C-c + ,就会看到mini buffer的提示,然后按下S-Insert 键,就自动出现了求和的值。比如:
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | |--------+-------+-------+-------| | <6> || | | | / | < | > | | | 2015-05-01 | 10 | 20 | 50 | | 2015-05-04 | 11 | 22 | 68 | | | 21 | 42 | 118 |
但是我还是觉得用lisp公式比较好,便于维护,因为一旦数据发生了变动,只需要重新计算一次表格即可。
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | |--------+-------+-------+-------| | <6> || | | | / | < | > | | | 2015-05-01 | 10 | 20 | 49 | | 2015-05-04 | 11 | 22 | 68 | | | 21 | 42 | 117 | #+TBLFM: @6$2='(+ @4$2..@5$2);N::@6$3='(+ @4$3..@5$3);N::@6$4='(+ @4$4..@5$4);N
然后引用范围的fields值可以用..表示from..to的语义。
最后,每次修改任何一个值,直接重新计算该表即可。这个方式比较好。
上面的公式还可以优化,可以使用相对位置指定最后一行:
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | 转化率 | |--------+-------+-------+-------+--------| | <6> || | | | | / | < | > | | | | 2015-05-01 | 11 | 20 | 42 | | | 2015-05-04 | 12 | 20 | 61 | | | 2015-05-05 | 19 | 19 | 80 | | | | 42 | 59 | 183 | | #+TBLFM: @7$2='(+ @4$2..@-1$2);N::@7$3='(+ @4$3..@-1$3);N::@7$4='(+ @4$4..@-1$4);N
elisp的除法就是/, 当出线浮点数就作为浮点除法,如果都是整数,就整除。
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | 转化率 | |--------+------+------+-------+--------------------| | <6> | | | | | | / | < | > | | | | 2015-05-01 | 11 | 20 | 42 | | | 2015-05-04 | 11 | 20 | 41 | | | 2015-05-05 | 22 | 40 | 84 | | | 2015-05-06 | 41 | 81 | 68.0 | | | All | 85 | 161 | 235.0 | 1.4596273291925466 | #+TBLFM: @8$2='(+ @4$2..@-1$2);N::@8$3='(+ @4$3..@-1$3);N::@8$4='(+ @4$4..@-1$4);N::@8$5='(/ @8$4 @8$3);N
现在开始计算美一行的转化率:
#+CAPTION: DAU统计 | 日期 | 新增 | 日活 | VV | 转化率 | |--------+------+-------+-------+--------------------| | <6> | | | | | | / | < | > | | | | 2015-05-01 | 11 | 20 | 42.0 | 2.1 | | 2015-05-04 | 12 | 20 | 41 | 2 | | 2015-05-05 | 22 | 41.0 | 79.0 | 1.9268292682926829 | | 2015-05-06 | 41 | 81 | 68.0 | 0.8395061728395061 | | All | 86 | 162.0 | 230.0 | 1.4197530864197532 | #+TBLFM: @4$5='(/ $4 $3);N::@5$5='(/ $4 $3);N::@6$5='(/ $4 $3);N::@7$5='(/ $4 $3);N::@8$2='(+ @4$2..@-1$2);N::@8$3='(+ @4$3..@-1$3);N::@8$4='(+ @4$4..@-1$4);N::@8$5='(/ $4 $3);N
注意,这里写法再次优化:
每个公式都有当前行的概念,比如
@4$5='(/ $4 $3);N由于@4已经指定了当前行数,所以后面$4和$3就不需要指定行号,直接用当前行即可。
公式一旦多起来,就需要工具帮忙管理。org tablei已经提供了。将光标停留在某个有公式的字段,然后按C-c ' ,就会出现新的buffer。
移动右边buffer的光标,左边buffer会自动切换,反之亦然。而且右边的buffer将公式自动换行了。十分方便。