2 votes

Utilisation de la sortie de purrr::safely()

Supposons que j'ai une très grande liste dans R. Certaines des valeurs sont valides et d'autres non. L'exemple utilise une liste avec seulement 6 éléments.

library(purrr)
library(dplyr)

myList <- list(-1, 0, 1, 2, 'poo', 'hi')

safe_log <- safely(log)

results <- myList %>%
  map(safe_log) %>%
  transpose()

allErrors <- results[['error']]

J'ai trois questions :

  1. Utilisation de allErrors qui sont des éléments de myList sont invalides ? Je cherche un vecteur entier qui renvoie :

    [1] 5 6

  2. Sous-ensemble allError pour ne montrer que les messages d'erreur. J'attends cette sortie :

    [[5]] <simpleError in .Primitive("log")(x, base): non-numeric argument to mathematical function>

    [[6]] <simpleError in .Primitive("log")(x, base): non-numeric argument to mathematical function>

  3. Sous-ensemble myList pour les seules valeurs valides. Je veux une nouvelle liste qui ressemble à ceci :

    [[1]] [1] -1

    [[2]] [1] 0

    [[3]] [1] 1

    [[4]] [1] 2

1voto

Marius Points 8425
  1. Vous pouvez vérifier quels éléments contiennent un type d'erreur en utilisant inherits :

    is_error = allErrors %>% map_lgl(~ inherits(., "error"))
  2. Une fois que vous avez fait cela, le sous-ensemble de la liste est simple :

    which(is_error)
    allErrors[is_error]
  3. Même chose pour les sous-ensembles pour obtenir les valeurs valides :

    myList[! is_error]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X