Menu
Coddy logo textTech

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] 15

Uma 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] 3

O 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"
challenge icon

Desafio

Fácil

Complete 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")
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de R online