Le top 10 des erreurs R, la 7 eme va vous surprendre

Author : Vincent Guyader
Tags : astuces, shiny, tidyverse
Date :

De la même façon qu’on apprend à marcher en tombant, on apprend R en faisant des erreurs… Dans cet article nous avons voulu regrouper les messages d’erreur les plus communs pour vous les expliquer et vous guider dans leur résolution

R error

Face à une erreur, le premier conseil, le plus important serait : “lisez les messages d’erreurs”. R a un peu de mal à s’exprimer, ce n’est pas toujours très clair, mais la réponse est souvent sous vos yeux. Osez lire les messages, on va vous aider à la déchiffrer 🙂

Lisez les Messages d’erreurs !

could not find function “%>%”

Une erreur classique, qui peut se produire avec %>% ou tout autre fonction.

Elle arrive dans 2 cas de figures :

CAS 1 :

soit vous avez fait une faute de frappe dans le nom de la fonction:

rnom(1) # au lieu de rnorm(1)
## Error in rnom(1): impossible de trouver la fonction "rnom"

Correction :

il “suffit” alors de corriger la faute de frappe.

rnorm(1)

CAS 2 :

Soit (et c’est le plus courant) vous n’avez pas chargé le package qui contient la fonction en question.

iris  %>% select(Species)
## Error in iris %>% select(Species) : 
  ## impossible de trouver la fonction "%>%"

Correction :

Pensez bien à mettre et à lancer les library(tidyverse) et autres library(cequevousvoulez) en haut de vos scripts et Rmd.

library(dplyr)
iris  %>% select(Species)

Error: unexpected SPECIAL in “%>%”

library(dplyr)
iris  
%>% select(Species)
## Error: <text>:3:1: SPECIAL inattendu(e)
## 2: iris  
## 3: %>%
##    ^

Vous avez fait un retour à la ligne au mauvais endroit.

Correction :

Le %>% ne devrait jamais se trouver en début de ligne, il faut faire le retour à la ligne apres et pas avant le %>%.

library(dplyr)
iris  %>% 
  select(Species)

Error: unexpected ‘else’ in “else”

if (  1 != 1 ) {print("youpi")} 
else { print("coucou")}
## Error: <text>:2:1: 'else' inattendu(e)
## 1: if (  1 != 1 ) {print("youpi")} 
## 2: else
##    ^

Même cause que la précédente erreur, Vous avez fait un retour à la ligne au mauvais endroit.

Correction :

Vous devez vous assurer que le else soit bien associé à la ligne précédente. Comme R interprête les instructions ligne à ligne, et dans la mesure ou un if seul, sans else associé, a du sens, assurez vous de ne pas laisser R croire que votre instruction est terminée, si ce n’est pas le cas.

if (  1 != 1 ) {print("youpi")
  } else { print("coucou")}

object ‘dataset’ not found

library(dplyr)
dataset %>% select(Species)
## Error in select(., Species): objet 'dataset' introuvable

L’objet sur lequel vous souhaitez travailler n’existe pas.

Correction :

Une faute de frappe sur le nom de l’objet ? Ou assurez vous de l’avoir bien chargé et assigné en amont.

there is no package called ‘diplyr’

library(diplyr)
## Error in library(diplyr): aucun package nommé 'diplyr' n'est trouvé

Elle arrive dans 2 cas de figures :

CAS 1 :

Soit vous avez fait une faute de frappe sur le nom du package à charger

Correction :

library(dplyr)

CAS 2 :

Soit le package n’est vraiment pas installé

Correction :

Un install.packages("dplyr") lancé dans la console résoudra votre soucis.

non-numeric argument to binary operator

df + 1
## Error in df + 1: argument non numérique pour un opérateur binaire

Celui ci peut être déroutant

Correction :

Assurez vous que l’opération arithmétique que vous effectuez a du sens, que vous la faite sur le bon objet. Jetez un œil à l’objet en question pour vous assurer qu’il contient bien ce a quoi vous vous attendez.
Dans l’exemple ci dessus df, est une fonction, et pas un nombre, donc ca ne marche pas.

Problem with filter() input ..1.

library(dplyr)
iris %>% filter(Species = "setosa")
## Error: Problem with `filter()` input `..1`.
## x Input `..1` is named.
## i This usually means that you've used `=` instead of `==`.
## i Did you mean `Species == "setosa"`?

Le message d’erreur contient la solution,

Correction :

vous avez mis un = alors qu’une condition s’écrit avec ==

library(dplyr)
iris %>% filter(Species == "setosa")

Error: unexpected symbol in:

library(dplyr)
iris %>% filter(Species == "setosa"
iris %>% filter(Species == "setosa")
## Error: <text>:3:1: unexpected symbol
## 2: iris %>% filter(Species == "setosa"
## 3: iris
##    ^

Ce genre de message d’erreur peut arriver quand vous lancez une ligne qui n’est pas terminée, pour laquelle par exemple, vous avez oublié la parenthèse fermante, une accolade ou un guillemet. Dans ce cas la R attend la fin de votre instruction, mais à la place de seulement lui envoyer la parenthese manquante vous lui renvoyez toutes l’instrution. C’est d’autant plus piegeux dans les Rmd puisqu’on ne pense pas à regarder la console pour voir ce qui a effectivement été envoyé à R.

Correction :

Vous avez deja corrigé! Maintenant que R vous a envoyé un message d’erreur, relancez votre instruction, elle va passer.

library(dplyr)
iris %>% filter(Species == "setosa"
)

Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

Voir l’erreur ci dessous

Can’t access reactive value ‘go’ outside of reactive consumer. Do you need to wrap inside reactive() or observer()?

library(shiny)
ui <- fluidPage(
  actionButton("go","go")
)
server <- function(input, output, session) {
  res <- input$go
}
shinyApp(ui, server)

Vous faites du shiny, et vous avez tenté d’utilise input$ en dehors d’un observe(), observEvent(), reactive(), render() ou autre.. ce n’est tout simplement pas possible. Pas de panique c’est arrivé à 100% des personnes avant vous 🙂

Correction :

Vous pouvez mettre un observe() autour de votre code… mais dans la mesure ou observe() et reactive() devraient être a proscrire de vos applications shiny (on en reparlera dans un autre article :p), je ne peux que vous encourager à réfléchir à une solution plus élégante.

library(shiny)
ui <- fluidPage(
  actionButton("go","go")
)
server <- function(input, output, session) {
  r <- reactiveValues(x=NULL)
  observeEvent( TRUE ,once = TRUE, {
    r$x <- input$go
  })
}
shinyApp(ui, server)

Une autre erreur récurrente à proposer ? n’hésitez pas a contribuer en commentaire!


À propos de l'auteur

Vincent Guyader

Vincent Guyader

Codeur fou, formateur et expert logiciel R


Comments


Also read