Bagikan melalui


Function.ScalarVector

Sintaksis

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

Tentang

Mengembalikan fungsi skalar jenis scalarFunctionType yang memanggil vectorFunction dengan satu baris argumen dan mengembalikan output tunggalnya. Selain itu, ketika fungsi skalar berulang kali diterapkan untuk setiap baris tabel input, seperti di Table.AddColumn, sebagai gantinya vectorFunction akan diterapkan sekali untuk semua input.

vectorFunction akan diteruskan tabel yang kolomnya sesuai dengan nama dan posisi parameter scalarFunctionType. Setiap baris tabel ini berisi argumen untuk satu panggilan ke fungsi skalar, dengan kolom yang sesuai dengan parameter scalarFunctionType.

vectorFunction harus mengembalikan daftar yang panjangnya sama dengan tabel input, di mana item di setiap posisinya harus merupakan hasil yang sama setelah mengevaluasi fungsi skalar pada baris input di posisi yang sama.

Tabel input diharapkan untuk dialirkan, sehingga vectorFunction diharapkan mengalirkan outputnya seiring input masuk, hanya bekerja dengan satu bagian input pada satu waktu. Secara khusus, vectorFunction tidak boleh menghitung tabel inputnya lebih dari sekali.

Contoh 1

Kalikan dua kolom tabel input dengan memproses input dalam batch 100.

Penggunaan

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

Hasil


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

Contoh 2

Menghitung skor pengujian dalam batch dua, dan mengisi bidang ID batch yang dapat digunakan untuk memverifikasi bahwa batching berfungsi seperti yang diharapkan.

Penggunaan

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

Hasil

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