Delen via


Function.ScalarVector

Syntaxis

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

Over

Retourneert een scalaire functie van het type scalarFunctionType die vectorFunction aanroept met één rij argumenten en retourneert de enkelvoudige uitvoer. Bovendien wordt, wanneer de scalaire functie herhaaldelijk wordt toegepast voor elke rij in een invoertabel, zoals in Table.AddColumn, vectorFunction daarentegen slechts eenmaal toegepast voor alle invoer.

vectorFunction wordt een tabel doorgegeven waarvan de kolommen qua naam en positie overeenkomen met de parameters van scalarFunctionType. Elke rij van deze tabel bevat de argumenten voor één aanroep van de scalaire functie, met de kolommen die overeenkomen met de parameters van scalarFunctionType.

vectorFunction moet een lijst met dezelfde lengte retourneren als de invoertabel, waarvan het item op elke positie hetzelfde resultaat moet hebben als het evalueren van de scalaire functie op de invoerrij van dezelfde positie.

De invoertabel wordt naar verwachting gestreamd, dus vectorFunction stroomt zijn uitvoer terwijl de invoer binnenkomt en werkt daarbij steeds met één deel invoer tegelijk. In het bijzonder mag vectorFunction de invoertabel niet meer dan één keer inventariseren.

Voorbeeld 1

Vermenigvuldig twee kolommen van de invoertabel door de invoer in batches van 100 te verwerken.

Gebruik

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

Uitvoer


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

Voorbeeld 2

Rekentestscores in groepjes van twee en vul een batch-ID-veld in dat kan worden gebruikt om te controleren of de batchverwerking naar verwachting werkt.

Gebruik

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

Uitvoer

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