R: Передача фрейма данных по ссылке

R имеет семантику передачи по значению, которая сводит к минимуму случайные побочные эффекты (хорошая вещь). Однако, когда код организован во множество функций/методов для повторного использования/удобочитаемости/обслуживаемости и когда этому коду необходимо манипулировать большими структурами данных, например., кадры больших данных, через ряд преобразований/операций семантика передачи по значению приводит к большому количеству копирования данных и большому количеству перебора кучи (плохая вещь). Например, кадр данных, который занимает 50 МБ в куче, переданной в качестве параметра функции, будет скопирован как минимум столько же раз, сколько и глубина вызова функции, а размер кучи в нижней части стека вызовов будет N* 50Мб. Если функции возвращают преобразованный/модифицированный фрейм данных из глубины цепочки вызовов, то копирование увеличивается еще на N.

Вопрос SO Как лучше всего избежать передачи фрейма данных?затрагивает эту тему, но формулируется таким образом, чтобы избежать прямого вопроса о передаче по ссылке, а выигрышный ответ в основном говорит: «Да, передача по значению - это то, как работает R». На самом деле это не на 100% точно. Среды R поддерживают семантику передачи по ссылке, а объектно-ориентированные платформы, такие как proto, широко используют эту возможность. Например, когда прототип объекта передается в качестве аргумента функции, а его «волшебная оболочка» передается по значению, для разработчика R семантика передается по ссылке.

Кажется, что передача большого фрейма данных по ссылке будет обычной проблемой, и мне интересно, как другие подошли к этому и существуют ли какие-либо библиотеки, позволяющие это сделать. В моих поисках я не обнаружил ни одного.

Если ничего не доступно, мой подход будет заключаться в создании прото-объекта, который обертывает фрейм данных. Я был бы признателен за указания на синтаксический сахар, который следует добавить к этому объекту, чтобы сделать его полезным, например., перегружая операторы $ и [[, а также любые ошибки, на которые я должен обращать внимание. Я не эксперт по R.

Бонусные баллы за независимое от типа решение передачи по ссылке, которое хорошо интегрируется с R, хотя мне нужны исключительно фреймы данных.

21
задан Community 23 May 2017 в 12:09
поделиться