Ik heb de fout ontvangen
Error in <my code> : target of assignment expands to non-language object
of
Error in <my code> : invalid (do_set) left-hand side to assignment
of
Error in <my code> : invalid (NULL) left side of assignment
Wat betekent het en hoe voorkom ik het?
Antwoord 1, autoriteit 100%
Deze fouten treden op wanneer u probeert een waarde toe te wijzenaan een variabele die niet bestaat, of die R niet kan behandelen als een name
. (Een naamis een type variabele dat een variabelenaam bevat.)
Probeer om de fouten te reproduceren:
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
(Kun je raden welke van de drie fouten NULL <- 1
retourneert?)
Een weinig bekende eigenschap van R is dat je waarden aan een string kunt toewijzen:
"x" <- 1 # same as x <- 1
Dit werkt niet als u de tekenreeks probeert te construeren met een complexere uitdrukking met bijvoorbeeld paste
.
paste0("x", "y") <- 1
## Error: target of assignment expands to non-language object
Zie
Maak een variabelenaam met “plakken” in R?en
Hoe variabelen meteen een naam te geven?
De oplossing hiervoor is om assign
:
assign(paste0("x", "y"), 1)
Een veelvoorkomend scenario waarin dit voorkomt, is wanneer u probeert toe te wijzen aan kolommen met gegevensframes. Vaak wordt geprobeerd om paste()
samen met de linkerhand van de opdracht, d.w.z.
paste0("my_dataframe$","my_column") <- my_value
Vaak is de optimale oplossing hier nietom toevlucht te nemen tot get
of assign
maar om te onthouden dat we per teken naar dataframekolommen kunnen verwijzen variabelen met de operator [
of [[
]:
x <- "my_column"
my_dataframe[,x] <- value #or...
my_dataframe[[x]] <- value
Evenzo kunt u niet toewijzen aan het resultaat van get
.
get("x") <- 1
## Error in get("x") <- 1 :
## target of assignment expands to non-language object
De oplossing is ofwel
assign("x", 1)
of gewoon
"x" <- 1
Het gebruik van get() met vervangende functiesbehandelt een complexer geval van get
gecombineerd met een vervangingsfunctie.
Bij gebruik van het magrittr
-pakket, volgt er per ongeluk leidingoperatorskunnen deze fout ook veroorzaken.
library(magrittr)
x <- 1 %>%
y <- 2
## Error in 1 %>% y <- 2 :
## target of assignment expands to non-language object
Zie ook Opdracht in R-taalwaarvan de antwoorden enkele van de geheimen met betrekking tot de opdracht beschrijven, met name de beschrijving van de R-taaldefinitie van Subsettoewijzing.