Изменить переменную внутри функции R

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

дает выход

[1] 5

Ответ 3

Я думаю, что метод @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)

является:

  • Вначале рассматривается правая сторона. Создана среда для функции abc.
  • В этом окружении создается указатель x.
  • x указывает на то же значение, на которое указывает g.
  • Тогда x указывает на 5
  • Функция возвращает указатель x
  • g теперь указывает на то же значение, на которое указывает x в момент возврата.

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

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

Ответ 4

Мне что-то не хватает, почему вы не можете просто сделать это?

g <- abc(g)

Ответ 5

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

changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}