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

- это:

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

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

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


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

g <- abc(g)

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

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