稍微研究了一下R语言按引用传递的问题,写过其他程序的人都知道,很多语言传递函数都有两种传递方式,按值传递和按引用传递,按值传递的意思就是,传入的数据仅仅是数据的值,而不是内存地址。也就是类似于Copy了一份数据,然后到函数中进行运算。而按引用传递的意思就是,直接把数据的地址穿进去。表现就是,如果你在函数中修改了传入数据的值,按值传递方法原本的数据不会有变化,但是按引用传递的话,原数据就会发生变化。
之所有想到这个问题,主要有两个原因,一个是因为基因组学研究中,经常会读取很大很大的数据(几十个G),如果做研究经常不停地需要按值传递,内存开销会很大。另一个是函数计算完以后,又需要返回一个大Object(矩阵、DataFrame,list都有可能),然后这个Object需要被重新赋值给原变量,时间消耗也会增加……
比如在R程序里,经常需要修改一个矩阵是这么写的:
A <- t(A)这样就很讨厌啊,每次对矩阵做一些修改,都需要来回复制两次数据!所以我想用传reference去解决这个问题,搜了一下,找到了下面的解决办法:
> setRefClass("MyClass", + fields=list( + name="character" + ) + ) > > City <- new("MyClass",name="Shanghai") > City Reference class object of class "MyClass" Field "name": [1] "Shanghai" > > ChangeName <- function(x) x$name="Beijing" > > ChangeName(City) > > City Reference class object of class "MyClass" Field "name": [1] "Beijing"简单来说,新建Class类的时候,直接将所需要修改的大数据集放在setRefClass的fileds下面,然后直接在函数里修改数值,就可以了。
改天我找一批大一些的生物数据测试一下效果……看看速度和内存消耗会不会有所优化。