在R中,这个错误的常见情况是:"SET_STRING_ELT()的值必须是'CHARSXP'而不是'字符'"

Dr *_*r G 8 r rcpp

我正在与R中的一个奇怪问题作斗争.我使用旧版本的Rcpp将R与一些C++集成(遗憾的是升级不是一个选项!),我使用的Rcpp是旧的RccpTemplate.但我怀疑问题是在那里.

我有一些R代码在大多数时间运行正常,但偶尔(特别是处理大量数据时)神秘地失败 Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

它总是在列表操作中失败,例如:

res[["blabla"]] = r
Run Code Online (Sandbox Code Playgroud)

但是如果我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
Run Code Online (Sandbox Code Playgroud)

Mar*_*gan 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
Run Code Online (Sandbox Code Playgroud)

然后仔细审查代码,特别是寻找误用PROTECT.见gdb help.我强烈建议更新R和你的软件包,因为bug已得到修复,你将需要投入大量时间.

  • 好.我想到了.在不太可能的情况下,另一个可怜的灵魂将与此战斗,我的问题是由于使用RcppRVector同时从R传递矩阵.不知何故RcppRVector没有抱怨,但有时导致内存损坏. (2认同)