3.5.2 Formula syntax for Calc

公式可以是 Emacs Calc 包能理解的任意代数表达式。 注意 Calc 有一个非标准约定: ‘/’ 的优先级低于 ‘*=, 因此 =a/b*c’ 会被解析为 ‘(a/(b*c))’ 。 在由 calc-eval 执行计算前(参见 从 Lisp 程序中调用 Calc]​)), 会按照上述规则进行变量替换。

区域向量可以直接传入 vmean~、~vsum 等 Calc 向量函数。

公式可以在分号后包含可选的模式字符串, 由一系列标志组成,用于影响执行期间 Calc 及其他模式的行为。 默认情况下,Org 使用标准 Calc 模式(精度 12、角度单位为度、分数与符号模式关闭)。 不过显示格式已改为 ‘(float 8)’ 以保持表格紧凑。 默认设置可通过变量 org-calc-default-modes 配置。

p20

将 Calc 内部计算精度设为 20 位。

n3’, ‘s3’, ‘e2’, ‘f4

将 Calc 计算结果以普通、科学、工程或定点格式返回给 Org。 只要 Calc 计算精度足够,其格式化精度不受限制。

D’, ‘R

Calc 的角度模式:角度制 / 弧度制。

F’, ‘S

Calc 的分数模式与符号模式。

u

Calc 的单位简化模式。Calc 同时也是符号计算器, 可以处理带单位的数值,在 Org 表格单元格中以数字后接单位字符串表示。 该模式指示 Calc 在返回结果前简化计算表达式中的单位。

T’, ‘t’, ‘U

Calc 或 Lisp 中的时长计算,参见 Durations and time values

E

是否以及如何处理空单元格。 不带 ‘E’ 时,区域引用中的空单元格会被忽略, Calc 向量或 Lisp 列表只包含非空值。 带 ‘E’ 时空单元格会被保留。 区域或单元格引用为空时,Calc 公式中使用 ‘nan’ (非数值), Lisp 公式中使用空字符串。添加 ‘N’ 可对两类公式都改用 0 代替空值。 对单个单元格而言,模式 ‘N’ 优先级高于 ‘E’ 。

N

将所有单元格按数值解析,非数值按 0 处理。 下一节会说明这对 Lisp 公式计算至关重要。 在 Calc 公式中偶尔使用,因为不带 ‘N’ 时数串已会被解析为数值。

L

字面量模式(Literal),仅用于 Lisp 公式。见下一节。

你还可以提供一个类似 printf 的格式说明符 format21,在 Calc 将计算结果返回给 Org 之后重新格式化,而不是由 Calc 自行处理格式。以下是几个示例:

$1+$2第一、第二单元格之和
$1+$2;%.2f同上,结果保留两位小数
exp($2)+exp($1)可使用数学函数
$0;%.1f将当前单元格重新格式化为一位小数
($3-32)*5/9华氏度转摄氏度
$c/$1/$cm利用 ‘constants.el’ 实现赫兹转厘米
tan($1);Dp3s1角度制计算,精度 3,科学计数法显示 1 位
sin($1);Dp3%.1e同上,但使用 format 格式化字符串控制显示
vmean($2..$7)使用向量函数计算列区域平均值
vmean($2..$7);EN同上,但将空单元格视为 0
taylor($3,x=7,2)$3 在 x=7 处的二阶泰勒展开式

Calc 还包含完整的逻辑运算集合(参见 逻辑运算)。例如:

if($1 < 20, teen, string(""))

若年龄 ‘$1’ 小于 20 则显示 ‘"teen"’ ,否则 Org 表格结果单元格置空。

if("$1" =​= "nan" || "$2" =​= "nan", string(""), $1 + $2); E f-1

前两列之和。若任一输入单元格为空,则结果单元格置空。 ‘E’ 用于避免将空单元格转为 0。 ‘f-1’ 是可选的 Calc 格式字符串, 类似 ‘%.1f’ ,但会保留空结果。

if(typeof(vmean($1..$7)) =​= 12, string(""), vmean($1..$7)); E

计算区域的平均值,若区域中存在任意空单元格则结果为空。 区域内的每个空单元格都会被替换为 ‘nan’ ,这会导致 ‘vmean’ 函数返回 ‘nan’ 。 随后 ‘typeof =’ 12= 会检测出 ‘vmean’ 返回的 ‘nan’ ,并将 Org 表格的结果单元格设为空。 当预期数据集永远不会存在缺失值时,使用此方式。

if("$1..$7" =​= "[]", string(""), vmean($1..$7))

区域平均值,跳过空单元格。 区域内所有空单元格均被忽略;若全部为空则平均值无定义,结果置空。 适用于数据集大小可变的场景。

vmean($1..$7); EN

区域平均值,空单元格按 0 计算。 仅适用于需要用 0 填充不完整样本的场景。

你可以用 defmath 在 Emacs Lisp 中自定义 Calc 函数,并在 Calc 公式语法中使用。


Footnotes

(21)

formatC 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Stringsformat 的文档字符串。