8

R の奇妙な問題と戦っています。古いバージョンの Rcpp を使用して、R を C++ と統合しています (残念ながら、アップグレードはオプションではありません!)。使用する Rcpp は古い RccpTemplate です。しかし、問題はそこにあるとは思えません。

ほとんどの場合は正常に動作する R コードがありますが、場合によっては (特に大量のデータを処理する場合)、不思議なことに失敗しますValue of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

リスト操作では常に失敗します。たとえば、次のようになります。

res[["blabla"]] = r

しかしoptions(error=recover)、エラーの後に同じことを使用して試行すると、問題なく割り当てを実行できます。C++ は数値ベクトルのみを処理し、実際には失敗した代入からコードが遠く離れています。

私の漠然とした質問は次のとおりです。そのような行動の最も一般的な原因は何ですか? 記憶違い?不良オブジェクト (おそらく不良RcppResultSet)? この問題を攻撃するのに問題があります...

完全を期すために:

platform       i386-pc-solaris2.10
arch           i386
os             solaris2.10
system         i386, solaris2.10
status
major          2
minor          10.1
year           2009
month          12
day            14
svn rev        50720
language       R
4

1 に答える 1

12

これは、おそらく使用しているパッケージ (R 自体ではありません) の C コードのエラーが原因です。C コードが正しく記述されておらず、そのコード ブランチをたまにしか評価しないか、または C コードが正しく記述されておらず、メモリが破損しています。おそらくこれには C デバッガーが必要です。Solarisについてはわかりませんが、Linuxでは、エラーを確実に再現するスクリプトを作成します(これには多少の作業が必要ですが、重要なステップです)。

R -d gdb
gdb> r # (r)un R
> ^C ## cntrl-C key, breaks into the debugger
gdb> b Rf_error # set breakpoint when error occurs; tab completion available
gdb> c # continue in R
> source("test-script.R") # [error occurs]
gdb> bt  # backtrace -- current call stack, from Rf_error entry
gdb> up  # move up the stack; use this to get to package C code

次に、コードを注意深く精査し、特に の誤用を探しますPROTECT。を参照してくださいgdb help。R とパッケージを更新することを強くお勧めします。バグは修正され、これにかなりの時間を費やすことになるからです。

于 2011-04-01T17:08:38.960 に答える