2011-04-01 283 views
8

我在R中遇到了一个奇怪的问题。我使用旧版本的Rcpp要将R与某些C++集成(可惜升级不是一种选择!),我使用的Rcpp是旧的RccpTemplate。但是我怀疑问题在那里。在R这个错误的常见情况是什么:“SET_STRING_ELT()的值必须是'CHARSXP'而不是'字符'”

我有一个运行良好的大部分时间一些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 
+0

一个可重复的例子会让它更容易帮助你---因为很少有人仍然运行与你的日期一样的软件版本,所以这很难实现。 – 2011-04-01 13:20:39

+0

我希望我可以选择运行哪个软件:S此问题很难重现,因此我怀疑它与某种内存损坏有关。我的问题更多的是,你有没有与类似的东西打过仗?最终成为问题的是什么?在调试中有点指导...... – 2011-04-01 13:32:52

+0

正如你可能想象的那样,我的用法并不关注我们称之为弃用的Rcpp API。至于错误消息,我不认为我曾见过它。它可能已经在R中得到了修复。 – 2011-04-01 13:42:37

回答

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和你的软件包,因为错误确实得到修复,而你将在此投入大量时间。

+2

好的。我想到了。在不太可能的情况下,另一个可怜的灵魂会与此战斗,我的问题是由于使用RcppRVector,同时传递从R的矩阵。不知何故RcppRVector没有抱怨,但有时导致损坏的内存。 – 2011-04-04 18:15:25

+0

您可能会在旧API中看到更多这些隐晦错误。 – 2011-05-09 09:18:25

相关问题