R имеет семантику передачи по значению, которая сводит к минимуму случайные побочные эффекты (хорошо). Однако, когда код организован во множество функций / методов для повторного использования / читабельности / ремонтопригодности и когда этому коду необходимо управлять большими структурами данных через, например, большие фреймы данных, посредством серии преобразований / операций, семантика передачи по значению приводит к к большому количеству копирования данных и большому разбору кучи (плохая вещь). Например, кадр данных, занимающий 50 МБ в куче, который передается в качестве параметра функции, будет скопирован как минимум столько же раз, сколько и глубина вызова функции, а размер кучи внизу стека вызовов будет равен N * 50Мб. Если функции возвращают преобразованный / измененный фрейм данных из глубины цепочки вызовов, то копирование увеличивается на другой N.
Вопрос SO Каков наилучший способ чтобы избежать передачи кадра данных? затрагивает эту тему, но формулируется таким образом, чтобы не задавать напрямую вопрос о передаче по ссылке, а в выигрышном ответе в основном говорится: «Да, передача по значению - это то, как R работает". На самом деле это не на 100% точно. Среды R поддерживают семантику передачи по ссылке, а структуры OO, такие как proto, используют эту возможность широко. Например, когда прото-объект передается как аргумент функции, а его «волшебная оболочка» передается по значению, разработчику R семантика передается по ссылке.
Кажется, что передача большого фрейма данных по ссылке была бы распространенной проблемой, и мне интересно, как другие подошли к этому и есть ли какие-либо библиотеки, позволяющие это сделать. В своих поисках я не нашел ни одного.
Если ничего не доступно, мой подход заключался бы в создании прото-объекта, который обертывает фрейм данных. Я был бы признателен за указатели на синтаксический сахар, который следует добавить к этому объекту, чтобы сделать его полезным, например, перегрузка операторов $ и [[, а также любые ошибки, на которые я должен обратить внимание. Я не эксперт по R.
Бонусные баллы за независимое от типа решение с передачей по ссылке, которое хорошо интегрируется с R, хотя мои потребности связаны исключительно с фреймами данных.
data.table
при поиске большогоdata.frame
. Что искали? - person Matt Dowle   schedule 26.06.2012