В R наиболее распространенные случаи этой ошибки: «Значение SET_STRING_ELT () должно быть« CHARSXP », а не« символ »» - PullRequest
8 голосов
/ 01 апреля 2011

Я борюсь со странной проблемой в R. Я использую старую версию Rcpp для интеграции R с некоторым C ++ (к сожалению, обновление не вариант!), Rcpp, который я использую, является старым RccpTemplate. Однако я сомневаюсь, что проблема там.

У меня есть некоторый код R, который в большинстве случаев работает нормально, но иногда (особенно при обработке большого количества данных) происходит таинственный сбой при Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

Всегда происходит сбой в операциях со списком, например ::1006

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

1 Ответ

12 голосов
/ 01 апреля 2011

Это происходит из-за ошибки в коде 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 и ваши пакеты, так как ошибки исправляются, и вы собираетесь потратить на это значительное количество времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...