最近我了解到R中没有引用,而是所有对象都是不可变的,并且每个赋值都会产生一个副本。
嗯。
一遍又一遍地复制大型矩阵似乎很可怕...
现在,我一直处于偏执状态,因为我害怕制作辅助函数(传递参数=赋值?返回值=赋值?),所以一直都在复制代码,如果我愿意,我害怕制作辅助变量。不是100%肯定会复制对象...
示例:
我想做的事
foo = function(someGivenLargeObject) {
returnedMatrix = someGivenLargeObject$someLargeMatrix # <- BAD?!?!?!?!
if(someCondition)
returnedMatrix = operateOn(returnedMatrix)
if(otherCondition)
returnedMatrix = operateOn(returnedMatrix)
returnedMatrix
}
我正在做什么:
foo = function(someGivenLargeObject) { # <- still BAD?!?!?!
returnedMatrix = NULL # <- No copy of someLargeMatrix is made!
if(someCondition)
returnedMatrix = operateOn(someGivenLargeObject$someLargeMatrix)
if(otherCondition)
returnedMatrix = operateOn(
if(is.null(returnedMatrix))
someGivenLargeObject$someLargeMatrix
else
returnedMatrix
) # <- ^ Incredible clutter! Unreadable!
if(is.null(returnedMatrix))
return(someGivenLargeObject$someLargeMatrix)
else
return(returnedMatrix) # <- does return copy stuff?!?!?!?!
该功能的第二个版本中的可读性损失非常惊人。但是-这样的价格是否可以避免在someLargeMatrix
和someCondition
都不成立的情况下不必要地复制otherCondition
?因为行returnedMatrix = someGivenLargeObject$someLargeMatrix
需要复制吗?
或者我处于偏执状态,我是否可以安全地使用该功能的更具可读性的版本,因为无需引用someLargeMatrix
就可以进行复制? (但是R中没有引用!!!)
我还希望函数调用/函数返回也不会复制内容? }
侧面注释:显然,这是很清楚的:在我如上所述的情况下,我不必要地复制对象时,我还没有遇到问题。读完“ R中没有引用”后,我感到很困惑,所以这个问题是基于我对缺少引用的隐含含义的担忧,而不是任何经验观察。
答案 0 :(得分:0)
唐纳德·努斯(Donald Knuth)有句著名的话:“过早的优化是万恶之源”,
http://wiki.c2.com/?PrematureOptimization
意识到这一点很高兴,但是在大多数情况下,代码的清晰性更为重要。 R通常足够聪明,可以确定何时需要复制。 (并非所有分配都会导致仅复制分配,以后会被修改)