Назначение на языке R
Мне интересно, как присвоение работает на языке R.
Рассмотрим следующий сеанс оболочки R:
> x <- c(5, 6, 7)
> x[1] <- 10
> x
[1] 10 6 7
>
который я полностью понимаю. Вектор (5, 6, 7) создан и связан с
символ "x". Позже "х" отскакивает от нового вектора (10, 6, 7), потому что векторы
являются неизменяемыми структурами данных.
Но что здесь происходит:
> c(4, 5, 6)[1] <- 10
Error in c(4, 5, 6)[1] <- 10 :
target of assignment expands to non-language object
>
или здесь:
> f <- function() c(4, 5, 6)
> f()[1] <- 10
Error in f()[1] <- 10 : invalid (NULL) left side of assignment
>
Мне кажется, что присваивать значения именованным структурам данных (например, "х" ) можно присваивать значения.
Причина, по которой я спрашиваю, заключается в том, что я пытаюсь реализовать ядро языка R, и я не уверен
как справиться с такими заданиями.
Заранее спасибо
Ответы
Ответ 1
Мне кажется, что присваивать значения именованным структурам данных (например, "х" ) можно присваивать значения.
Именно то, что говорится в документации для ?"<-"
:
Описание:
Assign a value to a name.
x[1] <- 10
не использует ту же функцию, что и x <- c(5, 6, 7)
. Первый вызов [<-
, а последний вызывает <-
.
Ответ 2
В соответствии с ответом @Owen на этот вопрос, x[1] <- 10
действительно выполняет две вещи. Он вызывает функцию [<-
и присваивает результат этого вызова x.
Итак, вы хотите достичь результата c(4, 5, 6)[1] <- 10
:
> `[<-`(c(4, 5, 6),1, 10)
[1] 10 5 6
Ответ 3
Вы можете вносить изменения в анонимные функции, но нет анонимных векторов. Даже R создает временные копии с именами, и вы иногда увидите сообщения об ошибках, которые отражают этот факт. Вы можете прочитать это в определение языка R на стр. 21, где он посвящен оценке выражений для "присвоения подмножества" и для других форм назначение:
x[3:5] <- 13:15
# The result of this commands is as if the following had been executed
`*tmp*` <- x
x <- "[<-"(`*tmp*`, 3:5, value=13:15)
rm(`*tmp*`)
И есть предупреждение не использовать *tmp*
как имя объекта, потому что он будет перезаписываться во время следующего вызова [<-