Rcpp 模块混乱
Rcpp modules confusion
我无法让 RCPP_MODULE
从 Rcpp::Rcpp.package.skeleton()
开始工作,我不确定我错过了什么。我将以下代码附加到我的包 ab
中的 rcpp_hello_world.cpp
:
class A {
public:
int foo() {
return 1;
}
};
RCPP_MODULE(ab_module) {
class_<A>("A").
constructor().
method("foo", &A::foo);
}
我然后运行Rcpp::compileAttributes()
和R CMD
build
和INSTALL
包。那么:
R> library(ab)
R> Rcpp::Module('ab_module', inline::getDynLib('ab'))
Uninitialized module named "ab_module" from package "ab"
Uninitialized module named "ab_module" from package "~/R/x86_64-pc-linux-gnu-library/3.6/ab/libs/ab.so"
Uninitialized module named "ab_module" from package "FALSE"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d469d0e0>"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d35ff690>"
R> rcpp_hello_world()
[[1]]
[1] "foo" "bar"
[[2]]
[1] 0 1
> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.4 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=nl_NL.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=nl_NL.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=nl_NL.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nl_NL.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ab_1.0
loaded via a namespace (and not attached):
[1] compiler_3.6.3 inline_0.3.15 Rcpp_1.0.5
如何初始化模块?
其他 Rcpp 代码确实可以在这台机器上运行,但我未能缩小这些包与此代码之间的差异。
我尝试将 import(Rcpp)
或 importFrom(Rcpp, evalCpp)
放入 NAMESPACE
中,但没有用。
两三个快速评论:
这确实很棘手,因为 Rcpp 模块 早于 Rcpp 属性。
模块初始化发生在来自 R 调用。你有
loadModule("AB_module", TRUE)
在什么地方?注意它可以在任何文件中R/
,你是不是
需要将其放入 .onLoad()
.
上周末更新了一个包,我也得到提醒,你可能仍然需要添加 R_init_ab(DllInfo *dll)
调用 R_CallMethodDef()
。我可以给你举个例子。
所以总而言之,我们可能需要 'how to start a Modules package in 2020' 的简单快速入门小插图。 And/or 重写现有的插图。
我无法让 RCPP_MODULE
从 Rcpp::Rcpp.package.skeleton()
开始工作,我不确定我错过了什么。我将以下代码附加到我的包 ab
中的 rcpp_hello_world.cpp
:
class A {
public:
int foo() {
return 1;
}
};
RCPP_MODULE(ab_module) {
class_<A>("A").
constructor().
method("foo", &A::foo);
}
我然后运行Rcpp::compileAttributes()
和R CMD
build
和INSTALL
包。那么:
R> library(ab)
R> Rcpp::Module('ab_module', inline::getDynLib('ab'))
Uninitialized module named "ab_module" from package "ab"
Uninitialized module named "ab_module" from package "~/R/x86_64-pc-linux-gnu-library/3.6/ab/libs/ab.so"
Uninitialized module named "ab_module" from package "FALSE"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d469d0e0>"
Uninitialized module named "ab_module" from package "<pointer: 0x5578d35ff690>"
R> rcpp_hello_world()
[[1]]
[1] "foo" "bar"
[[2]]
[1] 0 1
> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.4 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=nl_NL.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=nl_NL.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=nl_NL.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nl_NL.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ab_1.0
loaded via a namespace (and not attached):
[1] compiler_3.6.3 inline_0.3.15 Rcpp_1.0.5
如何初始化模块?
其他 Rcpp 代码确实可以在这台机器上运行,但我未能缩小这些包与此代码之间的差异。
我尝试将 import(Rcpp)
或 importFrom(Rcpp, evalCpp)
放入 NAMESPACE
中,但没有用。
两三个快速评论:
这确实很棘手,因为 Rcpp 模块 早于 Rcpp 属性。
模块初始化发生在来自 R 调用。你有
loadModule("AB_module", TRUE)
在什么地方?注意它可以在任何文件中
R/
,你是不是 需要将其放入.onLoad()
.上周末更新了一个包,我也得到提醒,你可能仍然需要添加
R_init_ab(DllInfo *dll)
调用R_CallMethodDef()
。我可以给你举个例子。
所以总而言之,我们可能需要 'how to start a Modules package in 2020' 的简单快速入门小插图。 And/or 重写现有的插图。