你能用"R"通过参考吗?例如,在以下代码中:
setClass("MyClass",
representation(
name="character"
))
instance1 <-new("MyClass",name="Hello1")
instance2 <-new("MyClass",name="Hello2")
array = c(instance1,instance2)
instance1
array
instance1@name="World!"
instance1
array
Run Code Online (Sandbox Code Playgroud)
输出是
> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"
> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "Hello1"
[[2]]
An object of class “MyClass”
Slot "name":
[1] "Hello2"
Run Code Online (Sandbox Code Playgroud)
但我希望如此
> instance1
An object of class “MyClass”
Slot "name":
[1] "World!"
> array
[[1]]
An object of class “MyClass”
Slot "name":
[1] "World!"
[[2]]
An object of class …Run Code Online (Sandbox Code Playgroud) R具有按值传递的语义,可以最大限度地减少意外的副作用(这是一件好事).然而,当代码被组织成许多用于可重用性/可读性/可维护性的函数/方法时,并且当代码需要通过例如大数据帧来操纵大数据结构时,通过一系列转换/操作,传递值语义引导大量复制数据和堆积颠簸(一件坏事).例如,一个数据帧需要50Mb的上作为函数参数将至少要复制的相同的次数作为在调用堆栈的底部的函数调用深度和堆的大小为N传递堆*50MB.如果函数从调用链的深处返回转换/修改的数据帧,则复制由另一个N上升.
SO问题避免传递数据框的最佳方法是什么?触及这个主题,但是以避免直接询问传递参考问题的方式表达,并且获胜的答案基本上说,"是的,值传递是R如何工作".这实际上不是100%准确.R环境支持传递引用语义,而诸如proto之类的 OO框架广泛使用此功能.例如,当一个proto对象作为函数参数传递,而它的"魔术包装"通过值传递给R开发人员时,语义是传递引用.
似乎通过引用传递大数据框架将是一个常见问题,我想知道其他人是如何接近它的,以及是否有任何库可以实现这一点.在我的搜索中,我没有发现一个.
如果没有可用的东西,我的方法是创建一个包装数据框的proto对象.我希望有关应该添加到此对象的语法糖的指针,以使其有用,例如,重载$和[[运算符,以及我应该注意的任何陷阱.我不是R专家.
与类型无关的传递参考解决方案的加分点与R很好地集成,尽管我的需求仅限于数据帧.