J'ai reçu l'erreur
Error in <my code> : target of assignment expands to non-language object
ou
Error in <my code> : invalid (do_set) left-hand side to assignment
ou
Error in <my code> : invalid (NULL) left side of assignment
Qu'est-ce que cela signifie et comment puis-je l'empêcher?
Ces erreurs se produisent lorsque vous essayez de attribuer une valeur à une variable qui n'existe pas ou que R ne peut pas traiter comme name
. (Un nom est un type de variable qui contient un nom de variable.)
Pour reproduire les erreurs, essayez:
1:2 <- 1
## Error in 1:2 <- 1 : target of assignment expands to non-language object
1 <- 1
## Error in 1 <- 1 : invalid (do_set) left-hand side to assignment
mean() <- 1
## Error in mean() <- 1 : invalid (NULL) left side of assignment
(Pouvez-vous deviner laquelle des trois erreurs NULL <- 1
Renvoie?)
Une caractéristique peu connue de R est que vous pouvez attribuer des valeurs à une chaîne:
"x" <- 1 # same as x <- 1
Cela ne fonctionne pas si vous essayez de construire la chaîne en utilisant une expression plus complexe en utilisant, par exemple, paste
.
paste0("x", "y") <- 1
## Error: target of assignment expands to non-language object
Voir
Créez un nom de variable avec "coller" dans R? et
Comment nommer les variables à la volée?
La solution est d'utiliser assign
:
assign(paste0("x", "y"), 1)
Un scénario courant dans lequel cela se produit est lorsque vous essayez d'affecter à des colonnes de trames de données. Souvent, une tentative sera faite pour paste()
ensemble la main gauche de l'affectation, c'est-à-dire.
paste0("my_dataframe$","my_column") <- my_value
Souvent, la solution optimale ici est pas de recourir à get
ou assign
mais à se rappeler que l'on peut se référer aux données encadrer les colonnes par des variables de caractères à l'aide de l'opérateur [
ou [[
:
x <- "my_column"
my_dataframe[,x] <- value #or...
my_dataframe[[x]] <- value
De même, vous ne pouvez pas attribuer au résultat de get
.
get("x") <- 1
## Error in get("x") <- 1 :
## target of assignment expands to non-language object
La solution est soit
assign("x", 1)
ou simplement
"x" <- 1
tiliser get () avec des fonctions de remplacement traite un cas plus complexe de get
combiné avec une fonction de remplacement.
Lors de l'utilisation du package magrittr
, une fuite accidentelle opérateurs de tuya peut également provoquer cette erreur.
library(magrittr)
x <- 1 %>%
y <- 2
## Error in 1 %>% y <- 2 :
## target of assignment expands to non-language object
Voir aussi Assignment in R language dont les réponses détaillent certains des arcanes liés à l'affectation, en particulier la description de la définition du langage R de Subset Assignment .