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

Назначение на языке 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, и я не уверен как справиться с такими заданиями.

Заранее спасибо

4b9b3361

Ответ 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* как имя объекта, потому что он будет перезаписываться во время следующего вызова [<-