Exercício 2 sobre Pipe (capítulo 6 do livro Curso-R)

Pessoal, tudo bem?

Alguém, por favor, poderia me ajudar com o exercício 2 do capítulo sobre Pipe do livro do Curso-R? O exercício pede para reescrever o código abaixo com o pipe (%>%):

x <- rnorm(100)
x.pos <- x[x>0]
media <- mean(x.pos)
saida <- round(media, 1)

Já tentei de várias formas, mas não consigo resolver. Uma das que mais tentei, dentre pequenas variações, foi:

library(magrittr)  
x <- rnorm(100) %>%
  c(x>0) %>%
  mean() %>%
  round(1)
#> Error in mean(.): objeto 'x' não encontrado

Alguém poderia me apontar o problema e, se possível, a solução?

Obrigado!

Oi Ulisses! Tudo bem, e com você?
Bem vindo ao fórum :slight_smile:

Vou colocar aqui uma forma de resolver, mas tem duas coisas que são importantes citar vendo a sua resolução:

  • você está salvando o resultado de todas as etapas (criar os números aleatórios, filtrar apenas os positivos, calcular a média e arredondar) em x. Para ficar mais claro, você pode salvar com o nome de saida, já que é o nome usado no exercício (assim fica menos confuso para você caso precise revisar!)

  • Quando usamos o pipe do pacote magrittr, podemos informar onde o resultado será substituído na próxima função usando o .

# exercício ------
set.seed(1000) # essa função faz com que a gente receba o mesmo resultado
# para os números aleatórios gerados com rnorm

x <- rnorm(100)
x.pos <- x[x > 0]
media <- mean(x.pos)
saida <- round(media, 1)

saida
#> [1] 0.8

# uma forma de resolver: ---------

library(magrittr)

set.seed(1000) # essa função faz com que a gente receba o mesmo resultado
# para os números aleatórios gerados com rnorm

saida_pipe <- rnorm(100) %>%
  # a função extract do magrittr substitui os colchetes []
  extract(. > 0) %>% # o "pulo do gato" é o ., que mostra onde o resultado anterior
  # deve ser substituido nessa etapa
  mean() %>%
  round(1)


saida_pipe
#> [1] 0.8


# testar se são respostas iguais
saida == saida_pipe
#> [1] TRUE

Created on 2022-02-08 by the reprex package (v2.0.1)

Essa resposta faz sentido para você?

Abraços!

Oi, Beatriz!

Muito obrigado pelas boas-vindas. Espero me tornar uma usuário recorrente aqui do Fórum. Ser tão bem recepcionado faz toda a diferença. :blush:

Na verdade, do jeito que digitei aqui, parece mesmo que eu estava salvando ambos os resultados em “x”. Mas, no meu RStudio, eu estava fazendo em momentos diferentes, reiniciando as sessões, para evitar a sobreposição. Mas, em realidade, é bem melhor do jeito que você fez. (Usando o “saida_pipe)”.

Consegui alcançar o resultado e entendi o sentido! O problema é que eu não conhecia essa função “extract()”. Sem ela, era impossível desenvolver a resposta, pelo visto. Nas partes do R4DS-1 e do livro até onde avancei, se bem me lembro, ela não foi abordada (ainda, ao menos). Às vezes, empolgado, vou avançando nos exercícios sem ter visto as aulas e dá nisso.

Muito obrigado, viu?

Abraços!