8 Stimmen

Welches sind die häufigsten Fälle dieses Fehlers in R: "Der Wert von SET_STRING_ELT() muss ein 'CHARSXP' sein, nicht ein 'Zeichen'"

Ich kämpfe mit einem seltsamen Problem in R. Ich benutze eine alte Version von Rcpp, um R mit einigen C++ zu integrieren (leider ist ein Upgrade keine Option!), die Rcpp ich verwenden, ist die alte RccpTemplate ein. Ich bezweifle jedoch, dass das Problem dort zu finden ist.

Ich habe einige R-Code, die gut die meiste Zeit läuft, aber gelegentlich (vor allem bei der Verarbeitung einer großen Menge von Daten) schlägt geheimnisvoll mit Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

Bei Listenoperationen schlägt es immer fehl, z. B.:

res[["blabla"]] = r

Aber wenn ich die options(error=recover) und nach dem Fehler das Gleiche versuchen, kann die Zuweisung ohne Probleme durchgeführt werden. C++ befasst sich nur mit numerischen Vektoren und ist eigentlich zeitlich und kodemäßig weit entfernt von den Zuweisungen, die fehlschlagen.

Meine vage Frage lautet also: Was sind die häufigsten Ursachen für ein solches Verhalten? Schlechtes Gedächtnis? Schlechte Objekte (vielleicht schlechte RcppResultSet )? Ich habe Schwierigkeiten, dieses Problem zu lösen...

Der Vollständigkeit halber:

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

13voto

Martin Morgan Punkte 44845

Dies ist auf einen Fehler im C-Code zurückzuführen, wahrscheinlich in einem von Ihnen verwendeten Paket (nicht in R selbst). Entweder ist der C-Code falsch geschrieben und Sie werten diesen Codezweig nur manchmal aus, oder der C-Code ist falsch geschrieben und er beschädigt den Speicher. Wahrscheinlich ist dafür ein C-Debugger erforderlich; ich bin mir bei Solaris nicht sicher, aber unter Linux würde ich ein Skript erstellen, das den Fehler zuverlässig reproduziert (das kann etwas Arbeit erfordern, ist aber ein wesentlicher Schritt) und dann Folgendes tun

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

und dann eine sorgfältige Prüfung des Codes, insbesondere auf die missbräuchliche Verwendung von PROTECT . Ver gdb help . Ich würde dringend empfehlen, R und Ihre Pakete zu aktualisieren, da Fehler behoben werden und Sie im Begriff sind, eine beträchtliche Menge an Zeit in diese Arbeit zu investieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X