Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Składnia
Function.ScalarVector(scalarFunctionType as type, vectorFunction as function) as function
Około
Zwraca funkcję skalarną typu scalarFunctionType, która wywołuje vectorFunction z pojedynczym wierszem argumentów i zwraca pojedyncze dane wyjściowe. Ponadto, gdy funkcja skalarna jest wielokrotnie stosowana dla każdego wiersza tabeli danych wejściowych, takich jak w Table.AddColumn, zamiast vectorFunction zostanie zastosowana raz dla wszystkich danych wejściowych.
vectorFunction zostanie przekazana tabela, której kolumny odpowiadają zarówno nazwom, jak i pozycjom parametrów scalarFunctionType. Każdy wiersz tej tabeli zawiera argumenty dla jednego wywołania funkcji skalarnej z kolumnami odpowiadającymi parametrom scalarFunctionType.
vectorFunction musi zwrócić listę o tej samej długości co tabela wejściowa, której element na każdej pozycji musi być taki sam jak wynik działania funkcji skalarnej na wierszu wejściowym o tej samej pozycji.
Oczekuje się, że tabela wejściowa będzie przesyłana strumieniowo, więc oczekuje się, że vectorFunction przesyła strumieniowo dane wyjściowe w miarę wprowadzania danych wejściowych, pracując tylko z jednym fragmentem danych wejściowych naraz. W szczególności vectorFunction nie może wyliczać swojej tabeli wejściowej więcej niż raz.
Przykład 1
Pomnóż dwie kolumny tabeli wejściowej, przetwarzając dane wejściowe w partiach 100.
Użycie
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
Wynik
Table.FromRecords({
[a = 1, b = 2, Result = 2],
[a = 3, b = 4, Result = 12]
})
Przykład 2
Obliczaj wyniki testów w partiach po dwie i uzupełnij pole identyfikatora partii, które może być użyte do sprawdzenia, czy grupowanie działa zgodnie z oczekiwaniami.
Użycie
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
Wynik
#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}
}
)