Comment gérer dans R : objet de type « fermeture » n’est pas sous-définissable
Une erreur que vous pouvez rencontrer dans R est :
object of type 'closure' is not subsettable
Cette erreur se produit lorsque vous tentez de sous-ensembler une fonction.
Dans R, il est possible de sous-ensembler des listes, des vecteurs, des matrices et des trames de données, mais une fonction a le type « fermeture » qui ne peut pas être sous-ensemble.
Ce didacticiel explique exactement comment résoudre cette erreur.
Comment reproduire l’erreur
Supposons que nous créions la fonction suivante dans R qui prend chaque valeur d’un vecteur et la multiplie par 5 :
#define function
cool_function <- function(x) {
x <- x*5
return(x)
}
Voici comment nous pourrions utiliser cette fonction en pratique :
#define data
data <- c(2, 3, 3, 4, 5, 5, 6, 9)
#apply function to data
cool_function(data)
[1] 10 15 15 20 25 25 30 45
Notez que chaque valeur du vecteur d’origine a été multipliée par 5.
Supposons maintenant que nous essayions de sous-ensembler la fonction :
#attempt to get first element of function
cool_function[1]
Error in cool_function[1] : object of type 'closure' is not subsettable
Nous recevons une erreur car il n’est pas possible de sous-ensembler un objet de type « fermeture » dans R.
On peut utiliser la syntaxe suivante pour vérifier que la fonction est bien du type ‘closure’ :
#print object type of function
typeof(cool_function)
[1] "closure"
Plus d’exemples d’objets « Fermeture »
Toute fonction dans R est du type « fermeture ». Par exemple, nous recevrions cette erreur si nous tentions de sous-ensembler n’importe quelle fonction dans la base R :
#attempt to subset mean function
mean[1]
Error in mean[1] : object of type 'closure' is not subsettable
#attempt to subset standard deviation function
sd[1]
Error in sd[1] : object of type 'closure' is not subsettable
#attempt to subset table function
tabld[1]
Error in table[1] : object of type 'closure' is not subsettable
Comment résoudre l’erreur
La façon de résoudre cette erreur consiste simplement à éviter de sous-définir une fonction.
Par exemple, si nous souhaitons appliquer notre fonction cool_function précédente uniquement au premier élément d’un vecteur, nous pouvons utiliser la syntaxe suivante :
#apply function to just first element in vector
cool_function(data[1])
[1] 10
Nous ne recevons pas d’erreur car nous avons sous-ensemble le vecteur au lieu de la fonction.
Ou nous pourrions appliquer la fonction cool_function à l’ensemble du vecteur :
#apply function to every element in vector
cool_function(data)
[1] 10 15 15 20 25 25 30 45
Nous ne recevons pas d’erreur car nous n’avons en aucun cas tenté de sous-ensembler la fonction.
Ressources additionnelles
Les didacticiels suivants expliquent comment résoudre d’autres erreurs courantes dans R :
Comment réparer : la condition a une longueur > 1 et seul le premier élément sera utilisé
Comment réparer dans R : dim(X) doit avoir une longueur positive
Comment réparer dans R : valeur manquante là où vrai/faux est nécessaire
Comment réparer : les NA introduites par la coercition