web-dev-qa-db-fra.com

Erreur dans <mon code>: la cible de l'affectation s'étend à un objet non linguistique

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?

28
Richie Cotton

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 .

49
Richie Cotton