R 找不到 Rcpp 函数
Rcpp function cannot be found by R
我在 Hadley's manual 之后的 RStudio
中构建了一个 R
package
(称为 myUtils
),它使用 cpp
文件。我的 cpp
文件位于 src
目录中,在 运行 之后创建:devtools::use_rcpp()
,在我的 R
目录下有一个名为 myUtils.R
的文件,这些行:
#' myUtils: A package with various functions for my analyses
#'
#'
#' @docType package
#' @name myUtils
#' @useDynLib myUtils
#' @importFrom Rcpp sourceCpp
NULL
这是我的 cpp
文件:
// [[Rcpp::depends(RcppArmadillo, RcppEigen)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
using namespace Rcpp;
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
然后我 运行 devtools::document()
将 useDynLib(myUtils)
添加到 NAMESPACE
文件。然后我 运行 Build & Reload
成功完成,并在 R
目录中创建了 RccpExports.R
文件,其中包含 cpp
函数,例如:
eigenMatMult <- function(A, B) {
.Call('_myUtils_eigenMatMult', PACKAGE = 'myUtils', A, B)
}
然后我尝试测试 eigenMatMult
但无法识别:
set.seed(1)
A <- matrix(rnorm(100), 10, 10)
> eigenMatMult(A=A,B=A)
Error: could not find function "eigenMatMult"
并且前面有 myUtils::
时都不会出现
我好像漏掉了什么,但我不知道是什么。
不胜感激。
Rcpp 属性机制本身不会向 NAMESPACE
文件中的导出指令添加功能。我们的示例使用通配符来导出所有内容。
因此,如果您的功能不可见,请执行其中一项或两项操作
- 通过
:::
调用,即 myUtils:::eigenMatMult(A, A)
- 将
eigenMatMult
添加到导出中,手动或通过 roxygen 标签
德克说:
add eigenMatMult
to exports, either by hand or via a roxygen tag
如果是由 roxygen2 生成的,我们可能不想手动修改 NAMESPACE
:
# Generated by roxygen2: do not edit by hand
所以,让我们为 roxygen2 添加一个标签,这样它就知道将我们的函数自动添加到 NAMESPACE
文件中。
您的代码示例如下所示:
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
它应该看起来像这样(注意带有 //' @export
的行):
//' @export
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
我在 Hadley's manual 之后的 RStudio
中构建了一个 R
package
(称为 myUtils
),它使用 cpp
文件。我的 cpp
文件位于 src
目录中,在 运行 之后创建:devtools::use_rcpp()
,在我的 R
目录下有一个名为 myUtils.R
的文件,这些行:
#' myUtils: A package with various functions for my analyses
#'
#'
#' @docType package
#' @name myUtils
#' @useDynLib myUtils
#' @importFrom Rcpp sourceCpp
NULL
这是我的 cpp
文件:
// [[Rcpp::depends(RcppArmadillo, RcppEigen)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
using namespace Rcpp;
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
然后我 运行 devtools::document()
将 useDynLib(myUtils)
添加到 NAMESPACE
文件。然后我 运行 Build & Reload
成功完成,并在 R
目录中创建了 RccpExports.R
文件,其中包含 cpp
函数,例如:
eigenMatMult <- function(A, B) {
.Call('_myUtils_eigenMatMult', PACKAGE = 'myUtils', A, B)
}
然后我尝试测试 eigenMatMult
但无法识别:
set.seed(1)
A <- matrix(rnorm(100), 10, 10)
> eigenMatMult(A=A,B=A)
Error: could not find function "eigenMatMult"
并且前面有 myUtils::
我好像漏掉了什么,但我不知道是什么。
不胜感激。
Rcpp 属性机制本身不会向 NAMESPACE
文件中的导出指令添加功能。我们的示例使用通配符来导出所有内容。
因此,如果您的功能不可见,请执行其中一项或两项操作
- 通过
:::
调用,即myUtils:::eigenMatMult(A, A)
- 将
eigenMatMult
添加到导出中,手动或通过 roxygen 标签
德克说:
add
eigenMatMult
to exports, either by hand or via a roxygen tag
如果是由 roxygen2 生成的,我们可能不想手动修改 NAMESPACE
:
# Generated by roxygen2: do not edit by hand
所以,让我们为 roxygen2 添加一个标签,这样它就知道将我们的函数自动添加到 NAMESPACE
文件中。
您的代码示例如下所示:
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
它应该看起来像这样(注意带有 //' @export
的行):
//' @export
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}