Passando Funções
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 28 de 64.
Uma função pode receber outra função como argumento e chamá-la. apply_twice() abaixo funciona com qualquer função de um argumento:
apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))Saída:
[1] 16
[1] "OK"Funções integradas, como sum, max ou toupper, também são valores, então passe-as pelo nome, sem parênteses. Com parênteses, elas seriam chamadas:
summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))Saída:
[1] 9
[1] 15Uma função que recebe um predicado, uma função que retorna TRUE ou FALSE, pode contar ou selecionar valores de acordo com qualquer regra:
count_if <- function(xs, keep) {
n <- 0
for (x in xs) if (keep(x)) n <- n + 1
n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))Saída:
[1] 2
[1] 3O chamador decide o comportamento e a função fornece o loop, então uma função abrange muitos casos:
transform_each <- function(xs, f) {
out <- c()
for (x in xs) out <- c(out, f(x))
out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))Saída:
[1] 10 20 30 40
[1] "A" "B"Desafio
FácilComplete apply_n(f, x, n). Chame f com x e depois com o resultado, n vezes no total, e retorne o valor final. Quando n for 0, retorne x sem alterações.
O código fornecido define três funções, double, inc e half. Ele lê o nome de uma delas, o valor inicial e n, e imprime o resultado de apply_n().
Experimente você mesmo
apply_n <- function(f, x, n) {
# Escreva seu código aqui
x
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
ops <- list(double = \(x) x * 2, inc = \(x) x + 1, half = \(x) x / 2)
cat(apply_n(ops[[input[1]]], as.numeric(input[2]), as.numeric(input[3])), 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