Подтвердить что ты не робот

Ошибка в <моем коде>: цель присвоения расширяется до неязыкового объекта

Я получил ошибку

Error in <my code> : target of assignment expands to non-language object

или

Error in <my code> : invalid (do_set) left-hand side to assignment

или

Error in <my code> : invalid (NULL) left side of assignment

Что это значит и как его предотвратить?

4b9b3361

Ответ 1

Эти ошибки возникают, когда вы пытаетесь присваивать значение переменной, которая не существует, или что R не может рассматриваться как name. (Имя - это тип переменной, который содержит имя переменной.)

Чтобы воспроизвести ошибки, попробуйте:

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

(Можете ли вы догадаться, какая из трех ошибок NULL <- 1 возвращает?)


Малоизвестная особенность R заключается в том, что вы можете назначать значения для строки:

"x" <- 1 # same as x <- 1

Это не работает, если вы попытаетесь построить строку, используя более сложное выражение, используя, например, paste.

paste0("x", "y") <- 1
## Error: target of assignment expands to non-language object

См.

Создать имя переменной с "paste" в R? и
Как перечислить переменные на лету?

Решением этого является использование assign:

assign(paste0("x", "y"), 1)

Общим сценарием, в котором это происходит, является попытка назначения столбцам кадров данных. Часто делается попытка paste() объединить левую руку задания, т.е.

paste0("my_dataframe$","my_column") <- my_value

Часто оптимальное решение здесь - это не прибегать к get или assign, но помнить, что мы можем ссылаться на столбцы фрейма данных с помощью символьных переменных с помощью оператора [ или [[:

x <- "my_column"
my_dataframe[,x] <- value #or...
my_dataframe[[x]] <- value

Аналогично, вы не можете назначить результат get.

get("x") <- 1
## Error in get("x") <- 1 : 
##   target of assignment expands to non-language object

Решение есть либо

assign("x", 1)

или просто

"x" <- 1

Использование функции get() с замещающими функциями связано с более сложным случаем get в сочетании с функцией замены.


См. также Назначение на языке R, ответы на которые подробно описывают некоторые связанные с назначением арканы, в частности описание определения языка R Назначение подмножества.