【问题标题】:Define a lambda function with infinite number of arguments定义具有无限个参数的 lambda 函数
【发布时间】:2022-07-27 01:36:42
【问题描述】:

VSTACK 等一些 Excel 原生函数允许无限数量的参数,它们的智能感知如下:

我想知道LAMBDA如何定义这样的函数。

我用可选参数试过try = LAMBDA(array1, [array2], [array3], [array4], 123),参数的个数不是无限的,intellisense也不完全一样:

【问题讨论】:

  • try() 是 udf 吗?
  • 是的,我定义了
  • 会猜测 lambda 不支持它或 docs 会提到它。 Lambda 相对较新。
  • 我不认为你会得到这个工作,因为LAMBDA() 中的所有参数都是通过名称管理器中的TRY() 公式预先定义的。就像您已经构建了 VLOOKUP() 并带有仍然会通过智能感知显示的可选参数。 VSTACK() 只采用完全相同类型的参数,因此没有预定义。题外话:你想在这里实现什么?或者更确切地说,你想通过这个TRY() 公式计算什么。

标签: excel lambda excel-formula excel-lambda


【解决方案1】:

有趣的时机 - 我昨天刚解决了同样的问题,因为我想访问新功能,但我不能在我的工作 PC 上做 Early Adopters。所以我为每个功能制作了一个“自制”版本。这里是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 函数,所以我只是做了一种粗略但可扩展的方式来添加更多参数而不重构整个事物。

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

【讨论】:

  • 您好,感谢您的解决方案。我投了赞成票;我将问题悬而未决以表明问题尚未解决(并希望有一天 Excel 提供此功能)。
  • 谢谢@SoftTimur - 我也是。我喜欢 LAMBDA 本身,必须在 Excel 中提供解决方案。我可以想出一些方法来标记一组无限的参数(例如,你可以在 Python 中做),但我不知道之后如何引用它们。这可能还需要新的 Helper 函数。在任何情况下,我们都必须创建人工集合并膨胀我们的代码,直到它存在为止。 :-(
【解决方案2】:

试试这个递归版本

VSTACK = LAMBDA([a_1], [a_2], [a_3], [a_4], [a_5], [a_6], [a_7], [a_8], [a_9], 让( 行 1,行(a_1), 行2,行(a_2), cols1,列(a_1), cols2,列(a_2), 行索引,序列(行 1 + 行 2), colindex,序列(1,MAX(cols1,cols2)), 堆栈,如果( 行索引

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2019-08-16
    • 2017-12-09
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多