在R中传递大矩阵的替代方法

3

使用全局变量代替在Matlab中传递大数组

我想请教关于R语言的类似问题。目前我正在函数之间传递巨大的矩阵。这些函数中的数据不会被更改,只是用到了这些矩阵。我的代码运行速度很慢。我想知道是否有其他选择,比如使用全局变量或面向对象的方式。谢谢。


尽管在概念上参数被复制到函数中,但实际上底层实现足够智能,不会复制未更改的参数,因此不会导致性能下降。 - G. Grothendieck
2个回答

5

R有类似于传递引用的功能。当你将一个对象赋值给另一个变量或传递给函数时,会创建另一个引用。但是,如果你通过其中一个引用修改了对象,那么就会实际创建一个副本。

f <- function(m) {
  .Internal(inspect(m))
}
g <- function(m) {
  m[1] <- 0
  .Internal(inspect(m))
}

m <- matrix(1,1)
.Internal(inspect(m))
## @452e308 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1
## ATTRIB:
##   @42c8ee8 02 LISTSXP g0c0 [] 
##     TAG: @2faaf98 01 SYMSXP g0c0 [MARK,LCK,gp=0x4000] "dim" (has value)
##     @452e2d8 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1

# f shows that this is the same object (@452e308):
f(m)
## @452e308 14 REALSXP g0c1 [NAM(2),ATT] (len=1, tl=0) 1
## ATTRIB:
##   @42c8ee8 02 LISTSXP g0c0 [] 
##     TAG: @2faaf98 01 SYMSXP g0c0 [MARK,LCK,gp=0x4000] "dim" (has value)
##     @452e2d8 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1

# g shows a newly allocated object (@3941998):
g(m)
## @3941998 14 REALSXP g0c1 [NAM(1),ATT] (len=1, tl=0) 0
## ATTRIB:
##   @3b9fc80 02 LISTSXP g0c0 [] 
##     TAG: @2faaf98 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "dim" (has value)
##     @3941ae8 13 INTSXP g0c1 [NAM(2)] (len=2, tl=0) 1,1

这只有在你进行赋值操作之前才是正确的。然后复制就开始了。 - IRTFM
@DWin 我认为那就是我说的。 - Matthew Lundberg
我猜这是因为我的陈述并不是关于传递 Promise 的一个特别好的总结。我被代码误导以为你在说 R 使用按引用传递。 - IRTFM

3

R语言中没有全局变量。如果你想使用传递引用的语义,你可以使用'data.table'包,这可能会有所帮助,或者你可以使用环境或ReferenceClasses。目前问题过于模糊,无法提供更多细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接