Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Sintaxe
Function.ScalarVector(scalarFunctionType as type, vectorFunction as function) as function
Sobre
Retorna uma função escalar do tipo scalarFunctionType que invoca vectorFunction com uma única linha de argumentos e retorna sua única saída. Além disso, quando a função escalar é aplicada repetidamente para cada linha de uma tabela de entradas, como em Table.AddColumn, em vez disso vectorFunction , será aplicada uma vez para todas as entradas.
vectorFunction será passada uma tabela cujas colunas correspondem em nome e posição aos parâmetros de scalarFunctionType. Cada linha desta tabela contém os argumentos de uma chamada para a função escalar, com as colunas correspondentes aos parâmetros de scalarFunctionType.
vectorFunction deve retornar uma lista do mesmo comprimento que a tabela de entrada, cujo item em cada posição deve ser o mesmo resultado da avaliação da função escalar na linha de entrada da mesma posição.
Espera-se que a tabela de entrada seja transmitida, portanto vectorFunction deve transmitir sua saída conforme a entrada é recebida, processando apenas um pedaço de cada vez. Em particular, vectorFunction não deve enumerar sua tabela de entrada mais de uma vez.
Exemplo 1
Multiplique duas colunas da tabela de entrada processando as entradas em lotes de 100.
Usage
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
Saída
Table.FromRecords({
[a = 1, b = 2, Result = 2],
[a = 3, b = 4, Result = 12]
})
Exemplo 2
Compute as pontuações de teste em lotes de dois e preencha um campo de ID do lote que pode ser usado para verificar se o envio em lote está funcionando conforme o esperado.
Usage
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
Saída
#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}
}
)