今天介绍嵌套LAMBDA函数的使用。 LAMBDA函数的语法如下: 其中的parameter是参数,可以是数组,单元格区域,数值,或者LAMBDA函数。 最后的calculation也可以是LAMBDA函数。如果是这样,我们就使用了嵌套的LAMBDA函数。 例如, TESTFUNC = LAMBDA(x, LAMBDA(a, a + x)) 就是一个嵌套的LAMBDA函数。 TESTFUNC的逻辑非常简单,一眼就可以明白它要什么。但是要分析其运行过程却并不是一目了然的。 其使用逻辑可以用下图表示: 对这个函数的调用使用公式: =TESTFUNC(x) x被作为参数传递给外层的LAMBDA函数,外层的LAMBDA函数需要根据计算逻辑处理并返回。这个计算逻辑就是内层的LAMBDA函数: =LAMBDA(a, a+X) 这里的a是参数,x不再是参数。x是外层LAMBDA函数传递进来的,对内层LAMBDA函数来说,相当于常量。 内层的LAMBDA函数需要根据计算逻辑返回,这个计算逻辑就是: a+x 这个函数并不能像以前我们创建过的自定义函数一样调用。 注意,外层的LAMBDA函数只能接收一个参数,所以,只能写成: =TEXTFUNC(10) 根据上面的分析,这个公式返回了一个LAMBDA函数: LAMBDA(a,a+x) 显然,此时x=10,因此,这个LAMBDA函数变成了: LAMBDA(a, a+10) 这个函数是需要输入参数的,比如: LAMBDA(a, a+10)(5) 结果就是15。 综合上面的过程,TESTFUNC应该用如下形式调用: =TESTFUNC(10)(5) 其中第一个括号内是外层LAMBDA函数的参数,第二个括号中是内层LAMBDA函数的参数。 仔细想一下,就会发现,上面的TESTFUNC完全可以用如下的代码创建: TESTFUNC1 = LAMBDA(x, a, a + x) 从计算逻辑上来说,二者完全等价。只是调用方式不同。TESTFUNC1用普通的方式调用即可: =TESTFUNC1(10, 5) 那么我们为什么还有使用嵌套的形式呢? 实际上,大部分场景中,我们都不建议写成嵌套的调用,尤其是多层嵌套。不过,在某些场景中,这么做可以得到一些好处。 其实,大部分好处都是“语义”上的。 比如,Excel中有一个TEXTSPLIT函数,是通过分隔符对文本进行拆分,假设你遇到这样一个公式: =TEXTSPLIT(A3, B3) 如果你不是对这个函数非常熟悉的话,你一定很困惑A3和B3哪一个是要拆分的文本,哪一个是分隔符。 但是,假如有这样一个公式: =TEXTSPLITBY(B3(A3) 注意,这里的函数的第一部分是: TEXTSPLITBY(B3) 完全可以翻译成“根据B3拆分文本”, 那么整个公式就是: “根据B3拆分文本:A3” 这样的公式调用可读性更强,可维护性也更好一些。尤其是数据处理逻辑比较复杂的时候。 实际上,我们就是将这个处理逻辑中的参数分为两部分: 一组是需要直接进行处理的数据,另外一组是处理过程中的参数。 下面的例子中,我们创建了一个公式,可以根据需要使用不同的统计方式: STATISTICSFOR = LAMBDA(type, LAMBDA(data, SWITCH( type, "sum", SUM(data), "count", COUNT(data), "average", AVERAGE(data), "median", MEDIAN(data), "max", MAX(data), "min", MIN(data) ) ) ); 下面是这个函数的调用实例: =STATISTICSFOR("SUM")(A1:A10)=STATISTICSFOR("average")(A1:A10) 很明显,分别是对A1:A10区域的求和和求平均值。 这个功能经常和其他自定义函数结合在一起使用: ADDONE = LAMBDA(a, a + 1); ADDTWO = LAMBDA(a, a + 2); MYFUNCTION = LAMBDA(fn, LAMBDA(data, fn(data))); 其中, ADDONE,ADDTWO是两个自定义函数,代表了不同的计算逻辑。 MYFUNCTION则根据选择的不同函数,实现不同的计算逻辑: =MYFUNCTION(ADDONE)(A1:A10) 详细解释请看视频 |
|
来自: zonge > 《ExcelEasy》