問題タブ [rcpp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - R でのデータの高速境界
vec
長い (1E8 エントリから始まる)ベクトル があり、それを範囲 にバインドしたいとします[a,b]
。確かにvec[vec < a] = a
とをコーディングできますvec[vec > b] = b
が、これには、データに対する 2 つのパスと、一時的な指標ベクトル (~800MB、2 回) のための大きな RAM 割り当てが必要です。メイン メモリからローカル キャッシュにデータを 1 回だけコピーすれば、より適切に実行できるため、2 つのパスの燃焼時間は短縮されます (メイン メモリへの呼び出しは、キャッシュ ミスと同様に良くありません)。そして、これが複数のスレッドでどれだけ改善できるかは誰にもわかりませんが、貪欲にならないようにしましょう。:)
ベースRまたは見落としているパッケージに優れた実装がありますか、それともこれはRcpp(または私の旧友data.table
)の仕事ですか?
c++ - Windows での RInside サンプルのビルド (および実行)
私は、RInside + Rcpp + R + C++ + Windows の話はまったく初めてです。RInside の例を正常にコンパイルして実行することで、物事を進めようとしています。多くの初期の問題 (このような問題) をなんとか克服し、最終的に 64 ビットの RInside サンプル実行可能ファイルをビルドすることができました。
Rの最新バージョン、RToolsの最新バージョンを実行しています。RInside と RCPP をソースから実行してビルドしました
そうしないと、x86 バイナリしかビルドできませんでした (64 ビット Windows サーバー OS では実行できませんでした)。R コンソールからはすべて正常に動作します。次の例は、エラーなしで合格しました。
しかし、RInside の例を実行しようとすると、次のエラーが発生します。
何が起こっているのか誰にも分かりませんか?
よろしくお願いします。
編集: R 2.15.0 の問題のより詳細な再現。
CRAN から C:\R-2.15.0 に最新のビルドをインストールしました。64 ビット RGUI.exe を実行install.packages(c("Rcpp","RInside"),type="source")
し、Changed Makefile.win を実行して、x64 アーキテクチャを強制し、正しいインストール ディレクトリを指すようにしました。
make -f Makefile.win を実行
実行可能ファイルを取得しましたが、それらのいずれかを実行しようとすると、次のエラーが発生します。
c++ - rcpp/rinside パッケージを使用する場合、makefile に dll ライブラリを含める方法
Rinside/Rcpp パッケージで R を使用しています。Rinside パッケージに基づいて作成した C++ コードから、.exe/.o/.dll ファイル (A) を生成できました。
しかし、後で A.dll を他の関数のライブラリとして使用したいと思いました。しかし、私はそれを行う方法を理解できません。ヒントはありますか?または、私が参照できるドキュメントはありますか?
ありがとう
c++ - Rcpp: R データ フレームから派生した文字列を比較する適切な方法は?
Rcpp の文字列処理に頭を悩ませているので、「Rcpp::CharacterVector 要素の等価性をテストする方法」を見てきましたが、状況はそれよりも少し複雑です。
説明のために、ランダムに生成された名前とマークの 200 行のデータ フレームがあるとします。
次のインライン コード (Rcpp を使用) は、名前が付けられた人物がデータ フレームで最初に指定された人物であるすべての行のマークの合計を正しく計算することがわかりました (つまり、R の df$name[1]、または同等の名前[0] Rcpp コード):
name[] の値を表す別の変数を定義し、std::string に強制し、比較を行うのは面倒なので、これを可能な限り単純化したいと思います。次のように表記を単純化する何らかの方法が必要です (これは機能しないことに注意してください)...
このミニ学習プロジェクトの最終的な目標は、df$name 内の一意の名前を反復処理し、それぞれのマークの合計を計算し、すべて (一意の名前と対応する合計) を適切なデータ フレームとして返す方法を理解することです。 . 私は、他の例から最終的なデータ フレームを構築して返す方法のほとんどの要点を理解しました。頭を悩ませているのは、上記の文字列だけです。ご指摘ありがとうございます。
c++ - Rcpp: Rcpp (インライン) でデータ フレームを使用する場合の推奨コード構造
[これを別の場所でコメントとしてスケッチしましたが、適切な質問を作成することにしました...]
Rcpp でデータ フレームを使用する場合のコード構造に関して、現在「ベスト プラクティス」と見なされているものは何ですか? 入力データ フレームを R から C++ コードに簡単に「転送」できることは注目に値しますが、データ フレームに n 列がある場合、このデータを n 個の個別の (C++) ベクトルに分割する必要があるという現在の考え方です。使用前?
データ フレームで文字列 (文字ベクトル) 列を使用することに関する以前の質問への回答は、はい、これが正しいことであることを示唆しています。特に、私が間違っていない限り、データフレーム情報を直接参照するためのdf.name[i] などの表記法はサポートされていないようです(C 構造の場合のように)。
ただし、これにより、データ フレームを 1 行でサブセット化するのではなく、各変数を個別に処理する必要があり、データのサブセット化がはるかに面倒な状況に陥ります。では、Rcpp でのサブセット化は、ブール値ベクトルを介して暗黙的に行うのが最善であるという考えはありますか?
要約すると、データ フレームを C++ コードに送信することはできますが、"df.name[ i]" ファッション、および単純な基準を満たす行を選択することによって入力 df のサブデータフレームを生成する単純な方法はありません (たとえば、df.date が指定された範囲内にある)。
java - Rスクリプトを呼び出すC++またはJavaのRCPPまたはRCallerのベンチマーク?
私はこの答えを高くも低くも見てきたので、ここに投稿することにしました。Linux C ++プログラムでRCppのようなRスクリプト/関数を呼び出す場合、顕著な遅延が予想されますか?これは予想されるのでしょうか、それとも合理的に聞こえるでしょうか?Java JARファイルのRCallerのようなものを使用するとどうなりますか?同じRスクリプト/関数を呼び出している場合、C ++はJavaよりも高速だと思いますか?予想される違いはありますか?ありがとう
r - RcppArmadillo での QR 分解
RcppArmadillo を使用した QR 出力が R からの QR 出力と異なる理由は本当に混乱しています。Armadillo のドキュメントにも明確な答えはありません。基本的に、R に n * q (たとえば 1000 X 20 ) である行列 Y を指定すると、1000 X 20 および R 20 X 1000 である Q が返されます。これが必要です。しかし、Armadillo で QR ソルバーを使用すると、Q 1000 X 1000 と R 1000 X 20 がスローされます。代わりに R の qr 関数を呼び出すことはできますか? qx q ではなく、次元 nxq を持つ Q が必要です。以下のコードは私が使用しているものです(より大きな関数の一部です)。
誰かが RcppEigen でそれを行う方法を提案できれば、それも役に立ちます。
r - package.skeleton cxxfunction と R 関数
Rcpp のよくある質問を読んで、次のようなインライン プロトタイプを使用して関数を作成する方法を見つけました。
作る
完全に機能しましたが、通常の R 関数と cxxfunctions を混在させようとすると、機能しませんでした。推測はありますか?既存のスケルトンにコードを追加する方法は少なくともありますか?
r - Rcpp での効率的なサブセット化 (R の "which" コマンドと同等)
Rcpp には、コード内で優れたベクトル化された操作を許可するさまざまな「Rcpp sugar」コマンドがあります。以下のコードでは、データ フレームを横切って移動し、それをベクトルに分割してから、"ifelse" および "sum" シュガー コマンドを使用して、x が y または y+1 に等しい行の v の平均を計算します。すべてが正しく機能しているようです。
これよりもきちんとした方法があるかどうか疑問に思っています-たとえば、特定の条件を満たすインデックスポイントを与える「which」コマンドに相当するものはありますか? Armadillo には "find" という機能があるようですが、それは互換性のないオブジェクト タイプを使用することを意味します ("find" と "ifelse" を一緒に使用することはできません)。
同じトピックで、「ifelse」で複合論理条件を受け入れることは可能ですか? たとえば、以下の例では、indic の定義が 2 つの「ifelse」コマンドで構成されており、明らかに 1 つにしたほうがすっきりします。どんな考えでも大歓迎です。
回答をお待ちしております:)
r - 負の値をゼロに置き換える
負の配列ゼロのすべての値を設定します。
私は多くのことを試しましたが、まだ実用的な解決策を達成していません。条件付きのforループを考えましたが、うまくいかないようです。