【问题标题】:Understanding the behaviour of Function.ScalarVector了解 Function.ScalarVector 的行为
【发布时间】:2021-03-30 11:10:26
【问题描述】:

我有一个用例,我想将两个参数传递给由Function.ScalarVector 生成的函数(请参阅https://docs.microsoft.com/en-us/powerquery-m/function-scalarvector)。

我希望第二个参数可选地捕获表的两个或更多列,例如ScalarFun([Col1], {[Col2], [Col3]})。我希望这会将列表列表传递给函数本身。唉,它没有。

考虑这个例子,如果我定义一个函数来简单地捕获生成的输入列表(我们通常会将其传递给一个对列表有用的函数),我们可以看到传递一个包含两个值的列表和一个 串联两个值会产生非常不同的行为:

let
    ScalarFun = 
        Function.ScalarVector(
            type function (col as any) as any,
            (t) => 
                let 
                    buf = Table.Buffer(t) 
                in 
                    List.Transform(buf[col], each List.Distinct(buf[col]))
        ),
    TestTable = Table.FromColumns(
        {{"a","b","c"}, {"x","y","z"}}, 
        {"Col2", "Col3"}
    ),
    #"List syntax" = Table.AddColumn(
        TestTable, 
        "List1", 
        each Text.Combine(List.First(ScalarFun({[Col2],[Col3]})), ";")
    ),
    #"Concactenation syntax" = Table.AddColumn(
        #"List syntax", 
        "List2", 
        each Text.Combine(ScalarFun([Col2] & [Col3]), ";")
    )
in
    #"Concactenation syntax"

鉴于此输出,我可以看到我们将两个值组合成列表ScalarFun([Col1], {[Col2], [Col3]}) 的语法实际上是逐行操作的。然而,连接两个文本值就可以了(该函数传递了一个包含整个列的列表)。

列表只是一个值,所以我不明白为什么我的首选语法不起作用?

更新:

我很清楚,由于lazy evaluation,该函数的行为方式与我预期的不同。如果我尝试使用记录,我会看到同样的问题。然而,以这种相当复杂的方式传递一个列表“有效”:

Text.Split(Text.Combine({[Col2],[Col3]}, ";"),";")

我不打算将此作为答案发布,因为我不完全理解为什么这(默默地,没有错误)破坏了Function.ScalarVector 的预期行为。

【问题讨论】:

    标签: powerquery m


    【解决方案1】:

    列表列表与串联列表不同,因此我看不出有任何理由期望它们的行为方式相同。

    {TestTable[Col2], TestTable[Col3]} = {{a,b,c},{x,y,z}}
    TestTable[Col2] & TestTable[Col3]  = {a,b,c,x,y,z}
    

    【讨论】:

    • 取决于你所说的行为。通过行为,我的意思是标量函数被传递了每个列值的列表,而不是每个行值。当参数是连接的字符串时,标量函数将被传递{"ax","by","cz"}(参见示例输出中的List2)。我希望通过列表示例将其传递给{{"a", "x"}, {"b", "y"}, {"c", "z"}}
    • 还有一个额外的复杂情况,即 ScalarFun 需要一个列名,但您完全传递了其他内容。
    • 是吗?它应该期望type function (col as any) as any 中指定的任何类型。无论如何,两列的(文本)组合按预期工作,所以我认为这不是问题。
    猜你喜欢
    • 2017-11-08
    • 2014-05-29
    • 1970-01-01
    • 2016-09-28
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多