2016-10-19 9 views
0

Ich versuche, ein R-Modul mit Rcpp zu entwickeln. Denn es folgte ich ein (Dirk Eddelbuettel's guide)Fehler beim Erstellen eines Moduls mit Rcpp

Die Dateien meiner Bibliothek haben den Inhalt:

functions.hpp:

class myclass { 
    // my atributes and functions 
} 

functions.cpp:

#include <Rcpp.h> 

using namespace Rcpp; 

class myclass; 

RCPP_EXPOSED_CLASS(myclass) 

#include "functions.hpp" 

//Implementation of my funcions 

RCPP_MODULE(mymodule){ 
    class_<myclass>("myclass") 
    .constructor() 
    .method("oneMethod", &myclass::oneMethod) 
    //more methods 
; 

}

mypackageExports.R:

.onLoad<-function(libname, pkgname){ 
    require("methods") 
    loadRcppModules() 
} 

BESCHREIBUNG:

... 
LazyLoad: yes 
Depends: methods, Rcpp (>= 0.12.4) 
LinkingTo: Rcpp 
RcppModules: mymodule 

listet

useDynLib(mypackage) 
exportPattern("^[[:alpha:]]+") 
import(Rcpp) 

Wenn ich die Bibliothek mit dem R CMD INSTALL mypackage Befehl kompilieren habe ich den Fehler:

installing to /home/user/R/x86_64-pc-linux-gnu-library/3.3/mypackage/libs 
** R 
** preparing package for lazy loading 
** help 
*** installing help indices 
** building package indices 
** testing if installed package can be loaded 

*** caught segfault *** 
address (nil), cause 'memory not mapped' 

Traceback: 
1: .Call(Module__classes_info, xp) 
2: Module(m, pkg, mustStart = TRUE) 
3: doTryCatch(return(expr), name, parentenv, handler) 
4: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
5: tryCatchList(expr, classes, parentenv, handlers) 
6: tryCatch({ mod <- Module(m, pkg, mustStart = TRUE) if (isTRUE(direct)) {  populate(mod, ns) } else {  forceAssignInNamespace(m, mod, ns) } assign(.moduleMetaName(m), mod, envir = ns)}, error = function(e) { stop(sprintf("failed to load module %s from package %s\n%s",   m, pkg, conditionMessage(e)))}) 
7: loadRcppModules() 
8: fun(libname, pkgname) 
9: doTryCatch(return(expr), name, parentenv, handler) 
10: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
11: tryCatchList(expr, classes, parentenv, handlers) 
12: tryCatch(fun(libname, pkgname), error = identity) 
13: runHook(".onLoad", env, package.lib, package) 
14: loadNamespace(package, lib.loc) 
15: doTryCatch(return(expr), name, parentenv, handler) 
16: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
17: tryCatchList(expr, classes, parentenv, handlers) 
18: tryCatch(expr, error = function(e) { call <- conditionCall(e) if (!is.null(call)) {  if (identical(call[[1L]], quote(doTryCatch)))    call <- sys.call(-4L)  dcall <- deparse(call)[1L]  prefix <- paste("Error in", dcall, ": ")  LONG <- 75L  msg <- conditionMessage(e)  sm <- strsplit(msg, "\n")[[1L]]  w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w")  if (is.na(w))    w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L],     type = "b")  if (w > LONG)    prefix <- paste0(prefix, "\n ") } else prefix <- "Error : " msg <- paste0(prefix, conditionMessage(e), "\n") .Internal(seterrmessage(msg[1L])) if (!silent && identical(getOption("show.error.messages"),   TRUE)) {  cat(msg, file = stderr())  .Internal(printDeferredWarnings()) } invisible(structure(msg, class = "try-error", condition = e))}) 
19: try({ attr(package, "LibPath") <- which.lib.loc ns <- loadNamespace(package, lib.loc) env <- attachNamespace(ns, pos = pos, deps)}) 
20: library(pkg_name, lib.loc = lib, character.only = TRUE, logical.return = TRUE) 
21: withCallingHandlers(expr, packageStartupMessage = function(c) invokeRestart("muffleMessage")) 
22: suppressPackageStartupMessages(library(pkg_name, lib.loc = lib,  character.only = TRUE, logical.return = TRUE)) 
23: doTryCatch(return(expr), name, parentenv, handler) 
24: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
25: tryCatchList(expr, classes, parentenv, handlers) 
26: tryCatch(expr, error = function(e) { call <- conditionCall(e) if (!is.null(call)) {  if (identical(call[[1L]], quote(doTryCatch)))    call <- sys.call(-4L)  dcall <- deparse(call)[1L]  prefix <- paste("Error in", dcall, ": ")  LONG <- 75L  msg <- conditionMessage(e)  sm <- strsplit(msg, "\n")[[1L]]  w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w")  if (is.na(w))    w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L],     type = "b")  if (w > LONG)    prefix <- paste0(prefix, "\n ") } else prefix <- "Error : " msg <- paste0(prefix, conditionMessage(e), "\n") .Internal(seterrmessage(msg[1L])) if (!silent && identical(getOption("show.error.messages"),   TRUE)) {  cat(msg, file = stderr())  .Internal(printDeferredWarnings()) } invisible(structure(msg, class = "try-error", condition = e))}) 
27: try(suppressPackageStartupMessages(library(pkg_name, lib.loc = lib,  character.only = TRUE, logical.return = TRUE))) 
28: tools:::.test_load_package("mypackage", "/home/user/R/x86_64-pc-linux-gnu-library/3.3") 
An irrecoverable exception occurred. R is aborting now ... 
Segmentation fault (core dumped) 
ERROR: loading failed 

Kann jemand (@DirkEddelbuettel , mein Rcpps Guru) erzähle was ich gerade mache wro ng?

+2

Datei, die Sie diese Frage an die Mailing-Liste wahrscheinlich zu senden, wenn Sie möchten, Dirks Aufmerksamkeit, afaik, ist er am besten geeignet, auf direkte Fragen am vorgesehenen Ort dafür zu reagieren. – shayaa

+0

Sorry, weil ich keine Mailingliste benutzt habe, aber die Antwort wäre öffentlich?Ich werde es tun, wenn jemand mir nicht helfen kann, aber fragen hier ist die Antwort öffentlich und es könnte für andere nützlich sein –

+1

Alle Postings sind verfügbar, sie werden nur an Abonnenten verschickt. Jeder kann deine Beiträge lesen und die Antworten sind öffentlich. – shayaa

Antwort

0

Am Ende habe ich das Problem entdeckt, mit einem Konflikt mit einer Abhängigkeit verbunden war ich raubend bin und das ist der Rcpp.h

2

Nun, Sie haben einen Leitfaden von 2012 verwendet. Manchmal ändern sich die Dinge. Ich würde empfehlen auch Blick auf aktuelle Pakete mit Modulen.

Sie hier nicht mehr benötigen

.onLoad<-function(libname, pkgname){ 
    require("methods") 
    loadRcppModules() 
} 

Seit 2013 über alles, was wir verlangen eine einzige loadModule("moduleName", TRUE) in einem R ist, wirklich jede R-Datei.

Zum Beispiel kann der gesamten Inhalt des R/ Verzeichnisses der RcppCNPy package ist dies

[email protected]:~/git/rcppcnpy(master)$ cat R/*.R 

loadModule("cnpy", TRUE) 


[email protected]:~/git/rcppcnpy(master)$ 

als das Paket cnpy ein einzelnes Modul definiert.

Ebenso brauchen wir die RcppModules: ... Zeile in BESCHREIBUNG nicht mehr.

Schließlich enthält das Rcpp-Paket selbst ein vollständig funktionierendes Paket mit Modulen für seine eigenen Komponententests. Das kannst du dir auch ansehen.

Edit: Sie wollen wahrscheinlich auch auf importFrom(Rcpp, evalCpp) oder gleich in NAMESPACE die RCPP instanziiert wird.

+0

Der Fehler geht weiter, aber Sie haben völlig Recht, ich habe das Datum des Leitfadens nicht bemerkt. Entschuldigung für irgendeinen Incovenance –

+1

Ja, starten Sie einfach von einem kleinen _working_ Beispiel wie dem in 'inst/unitTests/testRcppModule' oder einem von CRAN und nehmen Sie es von dort. Und ich habe gerade einen weiteren Punkt zu 'NAMESPACE' hinzugefügt. –

Verwandte Themen