Map e mapply
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 33 de 64.
Map(f, xs, ys) percorre dois ou mais vetores em paralelo e chama f com um elemento de cada um: primeiro com os primeiros elementos, depois com os segundos elementos e assim por diante. Ele retorna uma lista:
totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])Saída:
[1] 3
[1] 7.5mapply() é a versão simplificadora, como sapply() para vários vetores. unlist() também transforma a lista de Map() em um vetor:
print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))Saída:
[1] 8.0 12.0 7.5
[1] 5 7 9Os vetores são correspondidos por posição, portanto devem ter o mesmo comprimento. mapply() nomeia os resultados de texto após o primeiro vetor; USE.NAMES = FALSE remove os nomes:
items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)Saída:
[1] "2 x tea" "3 x jam"Quando cada par precisar de um if, escreva uma função com vários argumentos e passe-a para mapply(). A condição então é executada uma vez por par:
describe <- function(name, age) {
group <- if (age < 18) "minor" else "adult"
paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))Saída:
[1] "Ada (adult)" "Tim (minor)"Desafio
FácilComplete order_lines(items, qty, prices). Retorne uma linha por item, 2 x tea = 8.00: a quantidade, x , o item, = e a quantidade multiplicada pelo preço com duas casas decimais. Use mapply() ou Map().
O código fornecido lê os itens, as quantidades e os preços como três linhas separadas por vírgulas e imprime cada linha retornada.
Experimente você mesmo
order_lines <- function(items, qty, prices) {
# Escreva seu código aqui
character(0)
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Substrings com substr()Formatação com sprintf()Dividindo e UnindoPesquisando StringsSubstituindo TextoRecapitulação - Criador de Nome de Usuário4Matrizes
Criando MatrizesIndexando MatrizesResumos de Linhas e ColunasAritmética de MatrizesRecapitulação - Tabela de Assentos10Fluxo de Controle Avançado
A Função switch()ifelse() Vetorizadorepeat e breakFunções RecursivasRevisão — Classificador de Notas2Consultas de Chave-Valor
Consultas em Vetores NomeadosVerificando ChavesAdicionando e Removendo ChavesPercorrendo NomesRecapitulação - Mesa de Ações5Projeto - Boletim de Notas
Adicionando AlunosRegistrando Notas3Conjuntos e Contagem
Valores ÚnicosOperações com ConjuntosTestes de PertinênciaContagem com table()Recapitulação - Convidados do Evento6Funções como Valores
Funções AnônimasPassando FunçõesRetornando FunçõesClosures com EstadoRecapitulação - Regras de Desconto9Data Frames
Criando Data FramesColunas e LinhasFiltrando LinhasAdicionando e OrdenandoRecapitulação - Relatório de Vendas12Projeto - Rastreador de Despesas
Registro de DespesasGastos TotaisPratique por conta própria: Compilador de R online