Fout in <mijn code> : doel van opdracht wordt uitgebreid naar niet-taalobject

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 <- 1retourneert?)


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 getof assignmaar 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 getgecombineerd 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.

Other episodes