Назначение на языке R

Мне интересно, как присваивание работает на языке R.

Рассмотрим следующий сеанс оболочки R:

> x <- c(5, 6, 7)
> x[1] <- 10
> x
[1] 10 6 7
>

что я полностью понимаю. Вектор (5, 6, 7) создан и привязан к символу 'x'. Позже «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
>

Мне кажется, что можно присваивать значения только именованным структурам данных (например, «x»).

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь реализовать ядро ​​языка R и не знаю, как справляться с такими заданиями.

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


person Sven Hager    schedule 23.05.2012    source источник
comment
Это отличный вопрос. Вы можете найти немного понимания в некоторых ответах здесь: stackoverflow.com/questions/10449366/   -  person Ari B. Friedman    schedule 23.05.2012


Ответы (3)


Мне кажется, что можно присваивать значения только именованным структурам данных (например, «x»).

Это именно то, что говорится в документации для ?"<-":

Описание:

 Assign a value to a name.

x[1] <- 10 не использует ту же функцию, что и x <- c(5, 6, 7). Первый звонит [<-, а второй звонит <-.

person Joshua Ulrich    schedule 23.05.2012
comment
Ах хорошо. Но синтаксический анализатор, похоже, не меняется между x ‹- 2 и x[1] ‹- 2, потому что функция canonical дает мне <-(x, 2) и <-([(x, 1), 2). Поэтому я думаю, что интерпретатор отправляет как-то по lvalue. - person Sven Hager; 23.05.2012

Согласно ответу @Owen на этот вопрос, x[1] <- 10 действительно делает две вещи. Он вызывает функцию [<- и присваивает результат этого вызова x.

Итак, чего вы хотите достичь c(4, 5, 6)[1] <- 10 результата:

> `[<-`(c(4, 5, 6),1, 10)
[1] 10  5  6
person Ari B. Friedman    schedule 23.05.2012
comment
Функция <- на самом деле является инфиксной функцией, которая может принимать 2+ аргумента, первый из которых всегда является реальным именем R (а не вектором символов). - person IRTFM; 06.07.2017

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

person IRTFM    schedule 23.05.2012