[Вопрос исправлен после ответов]
Спасибо за ответы.Мне было неясно в моем вопросе, за который я прошу прощения.
Я постараюсь дать более подробную информацию о нашей ситуации.У нас есть с.100 матриц, которые мы храним в окружающей среде.Каждый очень большой.Если это вообще возможно, мы хотим избежать копирования этих матриц при выполнении обновлений.Мы часто сталкиваемся с ограничением в 2 ГБ памяти, так что это очень важно для нас.
Итак, два наших требования: 1) избегать копий и 2) косвенно обращаться к матрицам по имени.Скорость, хотя и важна, но является побочной проблемой, которую можно решить, избегая копирования.
Мне кажется, что решение Томми заключалось в создании копии (хотя она полностью отвечала на мой настоящий вопрос, поэтому я 'm тот, кто виноват).
Приведенный ниже код является наиболее очевидным для нас, но он явно создает копию (как показано увеличением memory.size)
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(memory.size())
for (i in 1:300) {
temp <- paramEnv$testmat1[10,]
paramEnv$testmat1[10,] <- temp * 0
}
print(memory.size())
}
system.time(testfnDirect(myenv))
Использованиеключевое слово с , по-видимому, этого избегает, как показано ниже:
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(gc())
varname <- "testmat1" # unused, but see text
with (paramEnv, {
for (i in 1:300) {
temp <- testmat1[10,]
testmat1[10,] <- temp * 0
}
})
print(gc())
}
system.time(testfnDirect(myenv))
Однако этот код работает, обращаясь непосредственно к testmat1 по имени.Наша проблема в том, что мы должны обратиться к ней косвенно (мы не знаем заранее, какие матрицы мы будем обновлять).
Есть ли способ изменить testfnDirect так, чтобы мы использовали переменную varname, а не hardcoding testmat