2016-02-01 9 views
8

Я видел пару людей, использующих [<- в виде функции с польской нотации, напримерКак работает функция `[<-` в R?

x <- matrix(1:4, nrow = 2) 
`[<-`(x, 1, 2, 7) 

который возвращает

 [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

Я пытался играть с [<- немного, и похоже, что использование этого способа распечатывает результат чего-то вроде x[1,2] <- 7 без фактического выполнения задания. Но я не могу точно понять, что эта функция на самом деле делает, потому что в документации, приведенной для ?"[", только упоминается об этом попутно, и я не могу найти google или SO для «[< -».

И да, я знаю, что на самом деле с помощью это, вероятно, ужасная идея, мне просто любопытно, ради лучшего понимания Р.

+2

Это больше похоже на то, что R преобразует 'x [1,2] <- 7' в' x <- '[<-' (x, 1, 2, 7) '. – joran

+0

Если вы понимаете функцию '' '' '' и '<-', то функция' [<-' имеет большой смысл. Попробуйте '[(x, 1,2)'. Попробуйте '<- (a, 1)' –

+2

Я не вижу дубликата. Вопрос _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ По-видимому, это не вопрос, поставленный в указанном дубликате. –

ответ

4

Это то, что вам нужно будет сделать, чтобы получить назначение придерживаться:

`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7) 
x 
    [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

по сути то, что происходит в том, что [ создает указатель в строку-Col расположения x, а затем <- (который на самом деле является синонимом assign, который также может быть использован в инфиксной записи) является doin g фактическое «постоянное» задание. Не следует вводить в заблуждение, думая, что это назначение вызова по ссылке. Я уверен, что все еще будет временное значение x.

Ваша версия сделала переназначение (как видно по его возврату), но это присвоение было только в локальной среде вызова [<-, который не охватывал глобальную среду.

+0

Является ли 'x [1,2] <- 7' по вызову? – fishtank

+0

Нет.Это также создаст временную ценность. Большинство «обычных R» назначений - это вызов по обещанию, который больше походит на вызов по значению, чем вызов по ссылке. Пакет 'data.table' делает модификации своих объектов на месте. Механизм R6 был настроен таким образом, чтобы обеспечить более прямой доступ к объектам и предотвратить накладные расходы на копирование. –

2

С `[`(x, y) разрезает объект, а `<-`(x, z) выполняет назначение, похоже, `[<-`(x,y,z) выполнит задание x[y] <- y. Ответ на 42-й - отличное объяснение того, что на самом деле делает [<-, а главный ответ на вопрос `levels<-`(What sorcery is this? дает некоторое представление о том, почему R работает таким образом.

Чтобы увидеть, что на самом деле делает [<- под капотом, вы должны пойти к исходному коду C, который для [<- можно найти на http://svn.r-project.org/R/trunk/src/main/subassign.c (соответствующие части начинаются в пределах линии 1470). Вы можете видеть, что x, объект, «назначенный», защищен, так что только локальная версия мутирована. Вместо этого мы используем VectorAssign, MatrixAssign, ArrayAssign и т. Д. Для выполнения локального назначения, а затем возвращаем результат.