2016-10-19 61 views
0

我正在嘗試使用Rcpp開發R模塊。對於它,我跟着一個(Dirk Eddelbuettel's guide使用Rcpp創建模塊時出錯

我的媒體庫的文件的內容:

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 

命名空間:

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的專家)告訴我我在做什麼NG?

+2

你可能想,如果你想對這個問題發送到郵件列表德克的注意力,他最容易回答在預定場地直接提出的問題。 – shayaa

+0

對不起,因爲我還沒有使用郵件列表,但答案會公開嗎?如果有人不能幫助我,我會這樣做,但在這裏問的答案是公開的,它可能對其他人有用 –

+1

所有的帖子都可用,他們只能郵寄給訂閱者。任何人都可以閱讀你的帖子,答案是公開的。 – shayaa

回答

0

最後,我發現這個問題是用一個依賴我耗費了衝突的關係,即包括Rcpp.h文件

2

那麼,你使用了2012年的指南。有時事情會改變。我會建議目前包使用模塊。

在這裏,你不再需要

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

自2013年左右,所有我們要求的是在R單loadModule("moduleName", TRUE),任何真正的R檔。

例如,R/目錄RcppCNPy package整個內容是此

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

loadModule("cnpy", TRUE) 


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

作爲包定義了單個模塊cnpy

同樣,我們不再需要描述中的RcppModules: ...行。

最後,Rcpp包本身包含一個包含模塊的完整工作包,用於其單元測試。你也可以看看。

編輯:你可能也想在NAMESPACEimportFrom(Rcpp, evalCpp)或相似,這將實例RCPP。

+0

錯誤仍在繼續,但你是完全正確的,我沒有注意到指南的日期。對不起,不便之處 –

+1

是的,只需從'inst/unitTests/testRcppModule'中的一個小的_working_例子或一個來自CRAN的例子開始,並從那裏取出。我剛剛添加了一個重要的'NAMESPACE'。 –