изменить переменную в функции R - PullRequest
13 голосов
/ 07 декабря 2011

Как мне изменить аргумент, передаваемый функции в R?В C ++ это будет передаваться по ссылке.

g=4
abc <- function(x) {x<-5}
abc(g)

Я бы хотел, чтобы g было установлено на 5.

Ответы [ 5 ]

12 голосов
/ 07 декабря 2011

Есть способы, как показал @Dason, но на самом деле - вы не должны !

Вся парадигма R - «пройти по значению». @Rory только что опубликовал нормальный способ справиться с этим - просто верните измененное значение ...

Среды, как правило, являются единственными объектами, которые можно передать по ссылке в R.

Но в последнее время новые объекты, называемые ссылочными классами, были добавлены в R (они используют среды). Они могут изменять свои значения (но контролируемым образом). Возможно, вы захотите использовать их, если действительно чувствуете необходимость ...

4 голосов
/ 07 декабря 2011

Должен быть лучший способ сделать это, но ...

abc <- function(x){eval(parse(text = paste(substitute(x), "<<- 5")))}
g <- 4
abc(g)
g

дает вывод

[1] 5
1 голос
/ 07 декабря 2011

Я думаю, что метод @ Dason - единственный способ сделать это теоретически, но практически я думаю, что способ R. уже делает это.

Например, когда вы делаете следующее:

y <- c(1,2)
x <- y

x на самом деле просто указатель на значение c(1,2).Точно так же, когда вы делаете

abc <- function(x) {x <- 5; x}
g <- abc(g)

Это не значит, что вы тратите время на копирование g в функцию и затем копирование результата обратно в g.Я думаю, что R делает с кодом

g <- abc(g)

:

  1. Сначала рассматривается правая сторона.Для функции abc настроена среда.
  2. В этой среде создается указатель с именем x.
  3. x, указывающий на то же значение, на которое указывает g.
  4. Затем x указывает на 5
  5. Функция возвращает указатель x
  6. g теперь указывает на то же значение, на которое x указываетвремя возврата.

Таким образом, , а не , что существует целая куча ненужного копирования больших опций.

Я надеюсь, что кто-то может подтвердить/ исправить это.

0 голосов
/ 25 февраля 2014

У меня есть решение, похожее на @ Dason's, и мне любопытно, есть ли веские причины не использовать это или есть важные подводные камни, о которых я должен знать:

changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}   
0 голосов
/ 07 декабря 2011

Я что-то упускаю из-за того, почему вы не можете просто сделать это?

g <- abc(g)
...