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
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.
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!