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

这来自 C 代码中的错误,可能在您正在使用的包中(而不是 R 本身)。要么 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 回答