Function.ScalarVector

Syntax

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

Om

Returnerar en skalär funktion av typen scalarFunctionType som anropar vectorFunction med en enda rad argument och returnerar dess enskilda utdata. När skalärfunktionen används upprepade gånger för varje rad i en tabell med indata, till exempel i Table.AddColumn, tillämpas i stället vectorFunction en gång för alla indata.

vectorFunction kommer att ges en tabell vars kolumner motsvarar i namn och position parametrarna för scalarFunctionType. Varje rad i den här tabellen innehåller argumenten för ett anrop till den skalära funktionen, med kolumnerna som motsvarar parametrarna för scalarFunctionType.

vectorFunction måste returnera en lista med samma längd som indatatabellen, vars objekt vid varje position måste vara samma resultat som utvärdering av skalärfunktionen på indataraden med samma position.

Indatatabellen förväntas strömmas i, så vectorFunction förväntas strömma sina utdata när indata kommer in och bara arbeta med ett indatasegment i taget. I synnerhet får vectorFunction inte räkna upp indatatabellen mer än en gång.

Exempel 1

Multiplicera två kolumner i indatatabellen genom att bearbeta indata i batchar på 100.

Användning

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

Resultat


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

Exempel 2

Beräkna testresultat i batchar med två och fyll i ett batch-ID-fält som kan användas för att verifiera att batchbearbetning fungerar som förväntat.

Användning

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

Resultat

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