【发布时间】: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