我正在尝试使用Rcpp开发R模块。为此我跟着一个(Dirk Eddelbuettel's guide)
我的图书馆的文件包含以下内容:
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()
}
描述:
...
LazyLoad: yes
Depends: methods, Rcpp (>= 0.12.4)
LinkingTo: Rcpp
RcppModules: mymodule
NAMESPACE:
useDynLib(mypackage)
exportPattern("^[[:alpha:]]+")
import(Rcpp)
当我使用命令R CMD INSTALL mypackage
编译库时,出现错误:
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
任何人(@DirkEddelbuettel,我的Rcpp&#39;大师)能说出我做错了什么吗?
答案 0 :(得分:2)
嗯,你使用了2012年的指南。有时事情会发生变化。我建议 使用模块查看当前包。
在这里你不再需要
.onLoad<-function(libname, pkgname){
require("methods")
loadRcppModules()
}
从2013年开始,我们要求的只是R中的一个loadModule("moduleName", TRUE)
,实际上是任何R文件。
例如,RcppCNPy package的R/
目录的整个内容就是这个
edd@max:~/git/rcppcnpy(master)$ cat R/*.R
loadModule("cnpy", TRUE)
edd@max:~/git/rcppcnpy(master)$
因为包定义了单个模块cnpy
。
同样,我们不再需要DESCRIPTION中的RcppModules: ...
行。
最后,Rcpp软件包本身包含一个完整工作的软件包,其中包含用于自己的单元测试的模块。你也可以看一下。
修改:您可能还需要importFrom(Rcpp, evalCpp)
或类似NAMESPACE
的实例化Rcpp。
答案 1 :(得分:0)
最后,我发现问题与我正在消费的依赖冲突以及Rcpp.h文件的包含有关