Ответ 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 Назначение подмножества.