2011-04-01 280 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

相關問題