定义具有无限个参数的 lambda 函数

问题描述 投票:0回答:3

一些 Excel 本机函数(如

VSTACK
)允许无限数量的参数,并且它们具有如下智能感知:

我想知道如何通过

LAMBDA
定义这样的函数。

我通过可选参数尝试了

try = LAMBDA(array1, [array2], [array3], [array4], 123)
,参数的数量不是无限的,而且智能感知也不完全相同:

excel lambda excel-formula excel-lambda
3个回答
2
投票

有趣的时机 - 我昨天刚刚解决了同样的问题,因为我想访问新功能,但我无法在我的工作电脑上进行“早期采用者”操作。所以我为每个函数制作了一个“自制”版本。这里是

VSTACK

VSTACK =

LAMBDA( array1, array2, [array3], [array4], [array5], [array6], [array7], [array8], 

LET( 
    pattern, MAX(   2,
                    3*NOT(ISOMITTED(array3)),
                    4*NOT(ISOMITTED(array4)),
                    5*NOT(ISOMITTED(array5)),
                    6*NOT(ISOMITTED(array6)),
                    7*NOT(ISOMITTED(array7)),
                    8*NOT(ISOMITTED(array8)) ),
    stack, LAMBDA( array_1, array_2,
            LET( 
                rows1, ROWS( array_1 ), rows2, ROWS( array_2 ),
                columns1, COLUMNS( array_1 ), columns2, COLUMNS( array_2 ),
                rSeq, SEQUENCE( rows1 + rows2 ),
                cSeq, SEQUENCE(, MAX( columns1, columns2 ) ),
                IF( ISOMITTED(array_1),
                    array_2,
                    IF( ISOMITTED(array_2),
                        array_1,
                        IF( rSeq <= rows1,
                            INDEX( IF( array_1 = "", "", array_1), rSeq, cSeq ),
                            INDEX( IF( array_2 = "", "", array_2), rSeq-rows1, cSeq ) ) ) ) )
            ),
    SWITCH( pattern,
            2, stack(array1,array2),
            3, stack(stack(array1,array2),array3),
            4, stack(stack(stack(array1,array2),array3),array4),
            5, stack(stack(stack(stack(array1,array2),array3),array4),array5),
            6, stack(stack(stack(stack(stack(array1,array2),array3),array4),array5),array6),
            7, stack(stack(stack(stack(stack(stack(array1,array2),array3),array4),array5),array6),array7),
            8, stack(stack(stack(stack(stack(stack(array1,array2),array3),array4),array5,array6),array7),array8), )
    )
);

这不是您问题的答案。我知道没有办法制作一个具有无限数量参数的

LAMBDA
函数,所以我只是做了一个粗略但可扩展的方法来添加更多参数而不重构整个事情。

注意:这确实很粗糙,但这是一个选择。我也想过使用 递归以避免无限嵌套,但最终决定 放置迭代参数会令人困惑和混乱 比较。我的最终目标是制作“足够好”。


0
投票

尝试这个递归版本

STACK_V = LAMBDA([a_1], [a_2], [a_3], [a_4], [a_5], [a_6], [a_7], [a_8], [a_9],
    LET(
        a_cnt, 9-(ISOMITTED(a_1)+ISOMITTED(a_2)+ISOMITTED(a_3)+ISOMITTED(a_4)+ISOMITTED(a_5)+ISOMITTED(a_6)+ISOMITTED(a_7)+ISOMITTED(a_8)+ISOMITTED(a_9)),
        rows1, ROWS(a_1),
        rows2, ROWS(a_2),
        cols1, COLUMNS(a_1),
        cols2, COLUMNS(a_2),
        rowindex, SEQUENCE(rows1 + rows2),
        colindex, SEQUENCE(1, MAX(cols1, cols2)),
        stack, IFS(
                    ISOMITTED(a_1), a_2,
                    ISOMITTED(a_2), a_1,
                    rowindex <= rows1, INDEX(a_1, rowindex, colindex),
                    TRUE, INDEX(a_2, rowindex - rows1, colindex)
                ),
        IF(
            a_cnt < 2,
            a_1,
            STACK_V(stack, a_3, a_4, a_5, a_6, a_7, a_8, a_9)
        )
    )
);

0
投票

这个问题还没有本质的解决方案吗?我希望微软正式为我们提供一种输入参数的方法,可以使用 Lambda 函数无限延伸,就像使用 ISOMITTED 函数创建可选参数一样。

© www.soinside.com 2019 - 2024. All rights reserved.