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

재현 가능한 예제를 사용하면 조금 더 쉽게 도움을받을 수 있습니다. 어쨌든 몇 사람이 아직 소프트웨어 버전을 실행하고 있기 때문에 어려울 것입니다. –

+0

나는 내가 실행하는 소프트웨어를 선택해야한다. S이 문제는 다소 재현하기가 어렵 기 때문에 메모리 손상과 관련이 있다고 생각된다. 제 질문은 당신이 비슷한 것을 가지고 싸운 적이 있습니까? 무슨 문제가 끝났어? 디버깅에서 약간의 지침이 있습니다. –

+0

상상할 수 있듯이, 제 사용법은 우리가 비추천 Rcpp API라고 부르는 것에 초점을 맞추지 않습니다. 오류 메시지에 관해서는, 내가 본 적이 없다고 생각합니다. R에서 고정되었을 수도 있습니다. –

답변

12

이것은 C 코드에서 오류에서 오는, 당신이 사용하는 패키지 (하지 R 자체)의 가능성 :이 문제 ... 완성도를 들어

을 공격하는 문제에 봉착했습니다. C 코드가 잘못 작성되어 코드 분기를 평가하는 경우가 있습니다. 그렇지 않으면 C 코드가 잘못 작성되어 메모리가 손상됩니다. 아마도 C 디버거가 필요합니다. 제가 솔라리스에 대해 잘 모르겠지만, 리눅스에 내가 안정적으로 오류를 재현하는 스크립트를 작성할 것 (이것은 몇 가지 작업을 할 수 있지만, 필수적인 단계는) 다음

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

확인. 나는 그것을 알아. 드문 경우지만 다른 가난한 영혼이 이것과 싸울 것입니다. 제 문제는 R에서 행렬을 전달하는 동안 RcppRVector를 사용하는 것이 었습니다. 어떻게 든 RcppRVector는 불평하지 않았지만 때때로 메모리가 손상 될 수있었습니다. –

+0

이전 API에서는 이러한 숨겨진 오류를 더 많이 볼 수 있습니다. –