Del via


Function.ScalarVector

Syntaks

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

Omtrent

Returnerer en skalarfunktion af typen scalarFunctionType, der aktiverer vectorFunction med en enkelt række argumenter og returnerer dets enkelt output. Når skalarfunktionen anvendes gentagne gange for hver række i en tabel med input, f.eks. i Table.AddColumn, anvendes vectorFunction desuden én gang for alle input.

vectorFunction overføres en tabel, hvis kolonner stemmer overens med navnet og placeringen af parametrene for scalarFunctionType. Hver række i denne tabel indeholder argumenterne for ét kald til skalarfunktionen, hvor kolonnerne svarer til parametrene for scalarFunctionType.

vectorFunction skal returnere en liste med samme længde som inputtabellen, hvis element på hver position skal være det samme resultat som evalueringen af skalarfunktionen på inputrækken for den samme position.

Inputtabellen forventes at blive streamet, så vectorFunction forventes at streame outputtet, efterhånden som inputtet kommer ind, og fungerer kun med ét inputsegment ad gangen. vectorFunction må især ikke optælle inputtabellen mere end én gang.

Eksempel 1

Multiplicer to kolonner i inputtabellen ved at behandle inputtene i batches på 100.

brug

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

output


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

Eksempel 2

Beregn testresultater i batches på to, og udfyld et batch-id-felt, der kan bruges til at kontrollere, at batching fungerer som forventet.

brug

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

output

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