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

标签 r matrix pass-by-value

Using Globals instead of passing large arrays in Matlab

我的问题与上面的问题完全相同,但我想要一个关于 R 的答案。 我现在正在函数之间传递巨大的矩阵。矩阵中的数据在这些函数中没有改变。我只是使用矩阵。我的代码运行缓慢。我想知道是否有替代方法,例如使用全局变量或面向对象的方式。谢谢

最佳答案

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

关于r - 在 R 中传递大型矩阵的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599628/

相关文章:

c++ - 如何从 gluUnProject 重新定位近平面和远平面以考虑相机位置和角度?

java - 通过引用递归传递对象? java

r - 离散与连续情况下的映射与设置颜色

R:当字符串超过设置长度时,在 grid.table 中换行文本

r - 从服务器上的 R session 访问 BigQuery 的授权

r - dplyr::rename和dplyr::rename_all之间的区别

c++ - MatrixXf::Random 总是返回相同的矩阵

c++ - Mat::at<double>(i,j) SIGSEGV,段错误

functional-programming - D 中的容器语义和功能风格

python - 如何克隆一个列表以使其在分配后不会意外更改?