แชร์ผ่าน


Function.ScalarVector

วากยสัมพันธ์

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

ประมาณ

แสดงฟังก์ชันสเกลาของชนิด scalarFunctionType ที่เรียกใช้ vectorFunction กับแถวเดียวของอาร์กิวเมนต์ และแสดงผลลัพธ์เดียว นอกจากนี้ เมื่อมีการใช้ฟังก์ชันสเกลาซ้ําสําหรับแต่ละแถวของตารางของอินพุต เช่น ใน Table.AddColumnvectorFunction จะถูกนําไปใช้ครั้งเดียวสําหรับอินพุตทั้งหมด

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