Sdílet prostřednictvím


Function.ScalarVector

Syntaxe

Function.ScalarVector(scalarFunctionType as type, vectorFunction as function) as function

O nás

Vrátí skalární funkci typu scalarFunctionType, která vyvolá vectorFunction s jedním řádkem argumentů a vrátí její jediný výstup. Navíc, pokud skalární funkce je opakovaně použita pro každý řádek tabulky vstupů, například v Table.AddColumn, místo toho vectorFunction se použije jednou pro všechny vstupy.

vectorFunction se předá tabulka, jejíž sloupce odpovídají názvem a umístěním parametrům scalarFunctionType. Každý řádek této tabulky obsahuje argumenty pro jedno volání skalární funkce se sloupci odpovídajícími parametrům scalarFunctionType.

vectorFunction musí vrátit seznam se stejnou délkou jako vstupní tabulka, jejíž položka na každé pozici musí být stejný výsledek jako vyhodnocení skalární funkce na vstupním řádku stejné pozice.

Očekává se, že se vstupní tabulka streamuje, takže se očekává, že vectorFunction streamuje svůj výstup jako vstup, přičemž současně pracuje jenom s jedním blokem vstupu. Zejména vectorFunction nesmí vytvořit výčet vstupní tabulky více než jednou.

Příklad 1

Vynásobte dva sloupce vstupní tabulky zpracováním vstupů v dávkách 100.

Využití

let
    Compute.ScoreScalar = (left, right) => left * right,
    // When Function.ScalarVector batching kicks in, we'll receive all
    // of the inputs for the entire table here at once.
    Compute.ScoreVector = (input) => let
        chunks = Table.Split(input, 100),
        scoreChunk = (chunk) => Table.TransformRows(chunk, each Compute.ScoreScalar([left], [right]))
      in
        List.Combine(List.Transform(chunks, scoreChunk)),
    Compute.Score = Function.ScalarVector(
        type function (left as number, right as number) as number, 
        Compute.ScoreVector
    ),
    Final = Table.AddColumn(
        Table.FromRecords({
            [a = 1, b = 2],
            [a = 3, b = 4]
        }),
        "Result",
        each Compute.Score([a], [b])
    )
in
    Final

Výstup


Table.FromRecords({
    [a = 1, b = 2, Result = 2],
    [a = 3, b = 4, Result = 12]
})

Příklad 2

Počítejte skóre testů ve dvojicích a vyplňte pole ID dávky, které lze použít k ověření, že dávkování funguje, jak se očekává.

Využití

let
  _GradeTest = (right, total) => Number.Round(right / total, 2),
  _GradeTests = (inputs as table) as list => let
    batches = Table.Split(inputs, 2),
    gradeBatch = (batch as table) as list =>
      let
        batchId = Text.NewGuid()
      in
        Table.TransformRows(batch, each [Grade = _GradeTest([right], [total]), BatchId = batchId])
  in
    List.Combine(List.Transform(batches, gradeBatch)),
  GradeTest = Function.ScalarVector(type function (right as number, total as number) as number, _GradeTests),
  Tests = #table(type table [Test Name = text, Right = number, Total = number],
    {
      {"Quiz 1", 3, 4},
      {"Test 1", 17, 22},
      {"Quiz 2", 10, 10}
    }),
  // To break batching, replace [Right] with {[Right]}{0}.
  TestsWithGrades = Table.AddColumn(Tests, "Grade Info", each GradeTest([Right], [Total]), type record),
  // To verify batching, also expand BatchId.
  Final = Table.ExpandRecordColumn(TestsWithGrades, "Grade Info", {"Grade"})
in
  Final

Výstup

#table(
    type table [Test Name = text, Right = number, Total = number, Grade = number],
    {
      {"Quiz 1", 3, 4, 0.75},
      {"Test 1", 17, 22, 0.77},
      {"Quiz 2", 10, 10, 1}
    }
)