Изменить переменную внутри функции 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)
}