изменить переменную в функции R
Как изменить аргумент, передаваемый функции в R? В C++ это будет проходить по ссылке.
g=4
abc <- function(x) {x<-5}
abc(g)
Я бы g
для установки в 5.
5 ответов
есть способы, как показал @Dason, но на самом деле -Не стоит!
вся парадигма R состоит в том, чтобы"пройти по значению". @Rory просто опубликовал обычный способ обработки - просто верните измененное значение...
среды обычно являются единственными объектами, которые могут быть переданы по ссылке в R.
но в последнее время в R были добавлены новые объекты, называемые ссылочными классами (они используют среды). Они могут изменять свои значения (но под контролем). Возможно, вы захотите изучить их использование, если вы действительно чувствуете необходимость...
там должен быть лучший способ сделать это, но...
abc <- function(x){eval(parse(text = paste(substitute(x), "<<- 5")))}
g <- 4
abc(g)
g
дает выход
[1] 5
Я думаю, что метод @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
указывает на время возвращения.
таким образом,не что есть целая куча ненужного копирования больших вариантов.
я надеюсь, что кто-то может подтвердить/исправить это.
У меня есть решение, подобное @Dason, и мне любопытно, есть ли веские причины не использовать это или если есть важные подводные камни, о которых я должен знать:
changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}