Как изменить аргумент, передаваемый функции в R? В С++ это будет проходить по ссылке.
g=4
abc <- function(x) {x<-5}
abc(g)
Я хотел бы, чтобы g
был установлен в 5.
Как изменить аргумент, передаваемый функции в R? В С++ это будет проходить по ссылке.
g=4
abc <- function(x) {x<-5}
abc(g)
Я хотел бы, чтобы g
был установлен в 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
указывает на 5x
g
теперь указывает на то же значение, на которое указывает x
в момент возврата.Таким образом, дело не в том, что существует целая куча ненужного копирования больших опций.
Я надеюсь, что кто-то может подтвердить/исправить это.
Мне что-то не хватает, почему вы не можете просто сделать это?
g <- abc(g)
У меня есть решение, подобное @Dason's, и мне любопытно, есть ли веские причины не использовать это или если есть важные ошибки, о которых я должен знать:
changeMe = function(x){
assign(deparse(substitute(x)), "changed", env=.GlobalEnv)
}