3

Matlab で大きな配列を渡す代わりにグローバルを使用する

私の質問は上記の質問とまったく同じですが、R に関する回答が必要です。現在、関数間で巨大な行列を渡しています。これらの関数では、マトリックス内のデータは変更されません。私はちょうどマトリックスを使用します。コードの実行が遅いです。グローバルやオブジェクト指向の方法を使用するような代替手段があるかどうかを知りたいです。ありがとう

4

2 に答える 2

5

Rには参照渡し(一種)があります。オブジェクトを別の変数に割り当てるか関数に渡すと、別の参照が作成されます。ただし、参照の 1 つを介してオブジェクトを変更すると、実際のコピーが作成されます。

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
于 2013-05-17T01:28:02.397 に答える
3

R には「グローバル」はありません。参照渡しセマンティクスを使用する場合は、便利な「data.table」パッケージを使用するか環境または ReferenceClasses を使用できます。現時点では、質問が曖昧すぎて詳細を認めることはできません。

于 2013-05-17T00:55:40.507 に答える