Эффективный для памяти способ изменения переменной внутри функции - PullRequest
0 голосов
/ 02 мая 2018

Задача

Я хочу написать функцию, которая изменяет каждый столбец большой матрицы, x :

f = function(x){
    # do something to x
    # return x
}

Поскольку x очень большой, я бы хотел изменить его "на месте", т.е. без создания копии. Тем не менее, я понимаю, что в R функции «копировать при модификации». Другими словами, если я изменю x в функции f , R сделает копию x .

Предлагаемое решение ( Обновление: не работает! Подробности см. В ответах ниже. )

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

f = function(x){
    x = deparse(substitute(x))
    x = get(x, envir = globalenv())
    # do something to x
}

Вопрос

Тем не менее, люди на SO ОЧЕНЬ негативно относятся к передаче глобальных переменных в функции в R. Некоторых людей даже опровергают просто за то, что они спрашивают об этом.

Мой вопрос: каков наилучший способ сделать что-то подобное в R?

1 Ответ

0 голосов
/ 02 мая 2018

Этот вопрос уже обсуждался здесь:

Передача объекта в функцию без копирования при изменении

Ваш второй подход на самом деле не решает проблему. Вот тест, который я провел с результатами mem_used ()

library(pryr)
mem_used()
#41.3 MB

x <- matrix(1:1000000000, ncol=1000)
mem_used()
#4.04GB


f2<- function(x){
  print(mem_used())
  x = deparse(substitute(x))
  print(mem_used())
  x = get(x, envir = globalenv())
  x<- x+1
  print(mem_used())
  x
}

x <- f2(x)
#4.04 GB
#4.04 GB
#12 GB
mem_used()
#8.04GB
...