問題タブ [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.
oop - RInsideの「R」インスタンスをクラス/メソッド間のパラメーターとして渡す
私はRとC++を統合するために、RcppとRInsideを使用しています。複雑でありながら適切に設計されたC++アーキテクチャがあり、1つの関数内からRにアクセスするのは難しいと感じています。R
より多くのOOP設計を得るために、インスタンスを異なるクラス/関数に渡すことは可能ですか?はいの場合、例はありますか?
クエリを詳しく説明するために、私はこのようなことを言いたいと思います、
私が現在気付いているのは、fooを呼び出すたびに、おそらくRInsideの新しいインスタンスが作成されるということです。
ありがとう-エゴン
r - R では、このエラーの一般的なケースは何ですか:「SET_STRING_ELT() の値は、'character' ではなく 'CHARSXP' でなければなりません」
R の奇妙な問題と戦っています。古いバージョンの Rcpp を使用して、R を C++ と統合しています (残念ながら、アップグレードはオプションではありません!)。使用する Rcpp は古い RccpTemplate です。しかし、問題はそこにあるとは思えません。
ほとんどの場合は正常に動作する R コードがありますが、場合によっては (特に大量のデータを処理する場合)、不思議なことに失敗しますValue of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'
リスト操作では常に失敗します。たとえば、次のようになります。
しかしoptions(error=recover)
、エラーの後に同じことを使用して試行すると、問題なく割り当てを実行できます。C++ は数値ベクトルのみを処理し、実際には失敗した代入からコードが遠く離れています。
私の漠然とした質問は次のとおりです。そのような行動の最も一般的な原因は何ですか? 記憶違い?不良オブジェクト (おそらく不良RcppResultSet
)? この問題を攻撃するのに問題があります...
完全を期すために:
r - RInside: parseEvalQ 'Parse Error' により、例外が処理された場合でも、parseEvalQ への後続の各呼び出しで 'Parse Error' が発生します。
C++ 経由で R シェルをエミュレートしようとする私のコードでは、ユーザーが tcp 接続を介して R コマンドを送信し、実行時に RInside::parseEvalQ 関数を介して R インスタンスに渡すことができます。不適切な形式のコマンドを処理できる必要があります。parseEvalQ の引数として不正なコマンドが与えられるたびに、スローされた実行時エラーをキャッチします (RInside.cpp を見ると、parseEval(const string&, SEXP) 関数内で特定のエラーに「PARSE_ERROR」「status」というフラグが付けられています)、what() 「St9exception」例外を与えます。
私は 2 つの問題を抱えています。
1a. 最初の解析エラーの後、引き数が有効であっても parseEvalQ を呼び出すと、別の解析エラーが発生します。埋め込まれた R インスタンスは、解析エラーによって何らかの形で破損していますか?
1b. RInside のドキュメントでは、Rcpp::Evaluator::run を使用して C++ で R 例外を処理することを推奨しています (これは、エラー ステータス 'PARSE_ERROR を返す前に、parseEval(const string&, SEXP) の呼び出し中に R インスタンス内のどこかでスローされていると思われます)。 ')。私はこれを使用しようと実験しましたが、Rcpp::Evaluator::run を実際に使用する方法の例をウェブ上で見つけることができません。
2. 私のプログラムでは、stdout と stderr (C++ レベル) を tcp 接続のファイル記述子に再ルーティングします。RInside インスタンスからのエラー メッセージはコンソールに送信されますが、通常の出力は送信されません。stdout を stderr に再ルーティングするために、RInside コマンド 'sink(stderr(), type="output")' を送信します (stderr がコンソールに表示されているように見えるため) が、通常の出力はまだ表示されません。「print(command)」は機能しますが、通常の R シェルのように stdout をコンソールに直接渡すためのよりクリーンな方法が必要です。
どんな助けや考えも大歓迎です。私のコードの蒸留バージョンを以下に示します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
c++ - R: インライン パッケージを使用する場合の C++ 最適化フラグ
Rでインラインパッケージのcxxfunctionを使用する場合、cppコンパイラの最適化フラグをどのように変更しますか?
デフォルトでは、私のマシンでは、-g -O2
. -O3
しかし、最適化を使用して速度を上げたいと思います。Rcpp
それが違いを生む場合は、プラグインを使用します。
独自のプラグインを作成しようとしましたが、cxxfunction のさまざまな引数を設定しようとしましたが、何も機能しませんでした。
R CMD SHLIB
1つのオプションは、を使用する代わりに使用してコンパイルすることだと思いますcxxfunction
。inline
しかし、ほとんどのテスト ケースで使用されているため、Rcpp は の使用を推奨しています。
ご協力ありがとうございます。説明が必要な場合はお知らせください
c++ - Rcpp 関数で R 構造体の値を変更する方法
私はRのベクトルのリストのリスト、次のような構造を持っています:
A を Rcpp 関数に渡すと、
しかし、の値はA(i)(j)(n)
変化せず、まだ0のままです。何が問題なのか知っている人はいますか?
おかげで値を変更できませんA[[i]][[j]][[n]]
r - Rcppマトリックス:一度に1列ずつ行をループします
Rcppを試すのはこれが初めてで、この非常に単純な問題が問題を引き起こしています。ネストされたforループを使用して、一度に1列ずつ行列の個々の値を操作したいと思います。私が目指しているスクリプトは次のようになります。
必要な出力は次のようになります。
問題は明らかにこの行にあり、行列の個々の要素を参照する方法がわかりません。
これが愚かな初心者の質問である場合はお詫び申し上げます。ヒントをいただければ幸いです。
r - Rcppの基本的なドキュメント
厄介なC++コードに頼ることなく、一部のRコードの速度を向上させるためにrcppを調べたいと思います(これである程度の成功を収めましたが、地獄のコードのように見えます)。
そこで、Rcppで提供されているドキュメントと、 DirkEddelbuettelのサイトで提供されているドキュメントのバンドルを確認しました。RcppExamplesをインストールして確認しましたが、(少なくともそのドキュメントから)これらのほとんどはRcppClassic?を参照しています。それに加えて、私はいくつかのグーグルをしましたが、それは基本的な質問のように見えるものへの答えにはなりませんでした。
- Rcppのインデックスはゼロベースまたは1ベースで機能しますか
- リストはとの両方
operator()
を 提供しますoperator[]
が、明らかにそうではありませんoperator[[]]
。どれがRに類似し[]
ているかは明らかではありません。[[]]
- Rcppの要素に対するサポートはありますか(存在しないようです)?
注:実際、Rcpp-introduction.pdfの最初の例からいくつかの回答を見つけましたが、それは運のように感じました。
また、私stl
は非常に錆びているので、誰かがリストの各要素が(たとえば)print
stlスタイルのループで-edされている簡単な例を私に提供できれば、それは素晴らしいでしょう。
誰かが私をこの情報を見つけられなかった馬鹿と呼びたいのなら、先に進んであなたの一日を作ってください。それから私のものを作って、私が必要とするドキュメントを私に指摘してください:-)
Eddelbuettel氏と他のRcpp作成者への提案として(私は彼らの何人かがこれを読むことを期待しています):doxygenによって提供されるクラス階層などは、すでにRcppに深く関わっているときは本当にきれいですが、初心者にとっては( Rcpp)、私は「このクラスのこのメソッドは、このヘッダーファイルでこの演算子の宣言を見つけることができる」ではなく、「Rのその関数のようにこれを行う」のリストに興味があります。結局のところ、Rcppの目標の1つは、RでC ++を使用するためのしきい値を下げることだと理解していますか?注:私が見て理解したことから、私はRcppの実際のコードを高く評価し、その作成者に最高の敬意を払っています。基本的なドキュメントの欠如が単に「リソースの不足」の結果である場合、私はリソースになりたいと思っています(例:「基本的な」作業
r - スノーを介して並列コード内でRcppを使用してクラスターを作成する
関数を記述し、Rcpp
でコンパイルしましたinline
。今、私はそれを異なるコアで並行して実行したいのですが、奇妙なエラーが発生します。これは最小限の例です。この例では、関数をコンパイルして単独で正常に実行できますが、の関数から呼び出すfunCPP1
ことはできません。この関数は単一のプロセスとして適切に実行されますが、並行して実行すると次のエラーが発生します。snow
clusterCall
そしてここにいくつかのコードがあります:
c++ - RデータフレームとC++で同等のwhich.min()
Rコードをc++に変換していますが、データフレームと同じ種類の操作を可能にする同等の(最適な)構造を見つけたいと思いますが、C++です。
操作は次のとおりです。
- 要素(行)を追加する
- インデックスから要素(行)を削除します
- 最小値のインデックスを取得します
例:
Rcppを使用しているので、Rcpp :: DataFrameはオプションかもしれませんが(ただし、どのようにすればよいかわかりません)、これらの操作を何度も繰り返す必要があるため、タスクにはかなり時間がかかると思います。 Rに返送する必要はありません。
編集:
目標。ここでの目標はスピードを上げることです。コードをRからC++に変換するのは明らかな理由です(他にもあるかもしれません。それが私が明確にする理由です)。ただし、メンテナンスと簡単な実装が2番目になります。
操作の精度が向上します。アルゴリズムは次のとおりです。配列に大量のデータ(複数行)を追加してから、最小値を抽出して削除します。繰り返す。そのため、並べ替えられたベクトルを探すのではなく、配列が頻繁に更新(追加)されるため、常に最も低いデータをオンデマンドで検索します。速いと思いますが、間違っているかもしれません。
c++ - Rcppとインラインを使用してg++コンパイラフラグを設定するにはどうすればよいですか?
-std=c++0x
インラインでRcppを使用して設定したい。
インラインパッケージを使用しているときにR:C ++最適化フラグが表示されましたが、システム全体に変更を加えたくないので、Dirkの回答でオプション2を試していました。
私は試した:
しかし、詳細な出力は、それがそれを無視していることを示しています。CFLAGSも試してみましたが、既存の値は含まれていませんが、効果はありません。