2017-09-07 4 views
3

Rcppを使用して参照渡しの方法に関する多くの例を確認しました。私は例えばthis非常に大きい参照してください。しかし、私は1つの質問があります。 Rのオブジェクトとして行列があり、エントリ[1,1]に1を加えたいとします。行列がCppにある場合の例を私が見たが、私はリターンステートメントを使用せずにRで更新を返したい。 Rcpp参照によって渡された更新行列がRで返されます。

この

は私がリストで行った例であり、それは非常によく

//[[Rcpp::export]] 
void test(List& a){ 
a(0)=0; 
} 

私はマトリックスとsimilarely行う必要があります動作します。

//[[Rcpp::export]] 
void test(arma::mat& a){ 
    a(0,0)=0; 
} 

2番目の列は更新されずにリストが更新されます。

誰でも手伝ってもらえますか?

+1

私はおそらくあなたを助けることができるが、私はあなたがtest' 'に渡す行列を参照する必要があります。あなたは編集できますか? –

+0

Rのすべての関数に戻り値があります。もちろん、目に見えない "NULL"を返すことができます。しかし、行列を目に見えなく戻す方が賢明でしょう。 – Roland

+0

PrivéとRolandに感謝します。任意の行列で私を助けてください。行列2 * 2があり、return文を使わずに値[1,1]を変更したいとしましょう。実際、私はもっと複雑なケースでこのソリューションを使いたいと思っています。私の関数は2つのリストと3つの行列をとり、更新後も同じオブジェクトを返します。今のところ、私はリストに更新を入れます(私は5のリストを作成しました)、私はリストを返します。しかし、リストには大きな行列とリストが含まれているため、非常に重いです。したがって、私は参照渡しし、オブジェクトのリストをリターン変数として構築せずに更新したいと思います。 –

答えて

2

これはおそらく悪い習慣であることを再確認してみましょう。 voidを使用しないで、変更されたオブジェクトを返す - より一般的なアプローチです。

つまり、どちらの方法でも動作させることができます。 RcppArmadilloの場合は、(明示的な)参照を渡します。私は希望の動作この短い例のうち

> sourceCpp("/tmp/so.cpp") 

> M1 <- M2 <- matrix(0, 2, 2) 

> bar(M1) 

> M1 
    [,1] [,2] 
[1,] 42 0 
[2,] 0 0 

> foo(M2) 

> M2 
    [,1] [,2] 
[1,] 42 0 
[2,] 0 0 
> 

を得る:

#include <RcppArmadillo.h> 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
void bar(Rcpp::NumericMatrix M) { 
    M(0,0) = 42; 
} 

// [[Rcpp::export]] 
void foo(arma::mat M) { 
    M(0,0) = 42; 
} 

/*** R 
M1 <- M2 <- matrix(0, 2, 2) 

bar(M1) 
M1 

foo(M2) 
M2 
*/ 
+0

ありがとうございました!私はそれを取得し、それは非常にうまく動作します。実際、私は、より多くの大きな行列が更新されるより複雑なケースでは、このソリューションを使用したいと考えています。 1つの解決策は、更新をリストに入れてリストを返すことです。私はそれをしましたが、返されたリストは、たくさんの大きな行列と別のリストが含まれているため、非常に重いです。だから私は、リストと行列を参照して渡し、それらを更新したい。そうでなければ、(タプルやリストのように)それらをまとめることなく多くのオブジェクトを返す別の方法がありますか? –

+0

ようこそStackOverflowへ。回答があなたが提起した質問に対処するときは、質問を「受け入れる」(目盛りをクリックする)、または質問を「上書する」(上三角をクリックする)ことが一般的な礼儀です。 –

+0

ありがとうございます。私は答えを受け入れた。私は知りませんでしたが、私はアップ投票できることを知っています。私は現時点では投票できないようです。私には15の評判はありません。私の最後の質問のために、別の投稿を作成する必要がありますか? ありがとうございました –

関連する問題