Zdieľať cez


Function.ScalarVector

Syntax

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

O

Vráti skalárnu funkciu typu scalarFunctionType, ktorá vyvoláva vectorFunction s jedným riadkom argumentov a vracia jej jeden výstup. Keď sa ale skalárna funkcia opakovane použije pre každý riadok tabuľky vstupov, napríklad v Table.AddColumn, namiesto toho sa vectorFunction použije pre všetky vstupy.

vectorFunction sa odovzdá tabuľke, ktorej stĺpce sa zhodujú v názve, a umiestni parametre scalarFunctionType. Každý riadok tejto tabuľky obsahuje argumenty pre jedno volanie skalárnej funkcie so stĺpcami zodpovedajúcimi parametrom scalarFunctionType.

vectorFunction musí vrátiť zoznam s rovnakou dĺžkou ako vstupná tabuľka, ktorej položka na každej pozícii musí byť rovnaký výsledok ako vyhodnotenie skalárnej funkcie vo vstupnom riadku na rovnakej pozícii.

Vstupná tabuľka má byť streamovaná, takže sa očakáva, že vectorFunction po vstupe streamuje svoj výstup, pričom bloky vstupných údajov takto spracuje po jednom. Funkcia vectorFunction nesmie vyčísliť vstupnú tabuľku viackrát.

Príklad č. 1

Vynásobte dva stĺpce vstupnej tabuľky spracovaním vstupov v dávkach po 100.

používania

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ýstupu


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

Príklad č. 2

Vypočítajte výsledky testov v dávkach po dvoch a vyplňte pole ID dávky, ktoré možno použiť na overenie, či dávkovanie funguje podľa očakávania.

používania

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ýstupu

#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}
    }
)