Κοινοποίηση μέσω


Function.ScalarVector

Σύνταξη

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

Περίπου

Επιστρέφει μια συνάρτηση με μονόμετρες τιμές τύπου scalarFunctionType που καλεί vectorFunction με μία μόνο γραμμή ορισμάτων και επιστρέφει τη μοναδική της έξοδο. Επιπλέον, όταν η συνάρτηση με ανυσματική τιμή εφαρμόζεται επανειλημμένα για κάθε γραμμή ενός πίνακα εισόδων, όπως σε Table.AddColumn, αντί για vectorFunction θα εφαρμοστεί μία φορά για όλες τις εισόδους.

vectorFunction θα διαβιβαστεί ένας πίνακας του οποίου οι στήλες συμφωνούν με το όνομα και τη θέση των παραμέτρων του scalarFunctionType. Κάθε γραμμή αυτού του πίνακα περιέχει τα ορίσματα για μία κλήση στη συνάρτηση ανυσματικής τιμής, με τις στήλες που αντιστοιχούν στις παραμέτρους του scalarFunctionType.

vectorFunction πρέπει να επιστρέψει μια λίστα με το ίδιο μήκος με τον πίνακα εισόδου, του οποίου το στοιχείο σε κάθε θέση πρέπει να είναι το ίδιο αποτέλεσμα με την αξιολόγηση της συνάρτησης με ανυσματική τιμή στη γραμμή εισόδου της ίδιας θέσης.

Ο πίνακας εισόδου αναμένεται να μεταδοθεί μέσω ροής, επομένως, vectorFunction αναμένεται να μεταδίδει μέσω ροής την έξοδό του καθώς εισάγεται η είσοδος, δουλεύοντας μόνο με ένα τμήμα εισόδου κάθε φορά. Ειδικότερα, η vectorFunction δεν πρέπει να απαριθμεί τον πίνακα εισόδου της περισσότερες από μία φορές.

Παράδειγμα 1

Πολλαπλασιάστε δύο στήλες του πίνακα εισόδου επεξεργάζοντας τις εισόδους σε παρτίδες των 100.

χρήσης

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

εξόδου


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

Παράδειγμα 2

Υπολογίστε τις βαθμολογίες των δοκιμών σε παρτίδες των δύο και συμπληρώστε ένα πεδίο αναγνωριστικού παρτίδας που μπορεί να χρησιμοποιηθεί για να επαληθεύσετε ότι η ομαδοποίηση λειτουργεί όπως αναμένεται.

χρήσης

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

εξόδου

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