R 具有按值传递的语义,可以最大限度地减少意外的副作用(一件好事)。但是,当代码被组织成许多函数/方法以实现可重用性/可读性/可维护性时,以及当代码需要通过例如大数据帧、通过一系列转换/操作来操作大型数据结构时,传递值语义会导致大量的数据复制和大量的堆颠簸(一件坏事)。例如,在作为函数参数传递的堆上占用 50Mb 的数据帧将至少复制与函数调用深度相同的次数,并且调用堆栈底部的堆大小将为 N* 50MB。如果函数从调用链的深处返回一个转换/修改的数据帧,那么复制会增加另一个 N。
SO问题避免传递数据框的最佳方法是什么?涉及这个主题,但措辞方式避免直接询问传递引用问题,而获胜的答案基本上是说:“是的,传递值是 R 的工作方式”。这实际上并不是 100% 准确的。R 环境支持按引用传递语义,而诸如proto之类的 OO 框架广泛使用此功能。例如,当一个 proto 对象作为函数参数传递时,它的“魔法包装器”是按值传递的,对于 R 开发人员来说,语义是按引用传递的。
似乎通过引用传递大数据框将是一个常见问题,我想知道其他人是如何处理它的,以及是否有任何库可以实现这一点。在我的搜索中,我没有发现一个。
如果没有可用的东西,我的方法是创建一个包装数据框的原型对象。我会很感激有关应该添加到该对象以使其有用的语法糖的指针,例如,重载 $ 和 [[ 运算符,以及我应该注意的任何陷阱。我不是 R 专家。
与 R 很好地集成的与类型无关的按引用传递解决方案的加分点,尽管我的需求完全是数据帧。