C++函数不可用

jwe*_*aus 6 r devtools rcpp roxygen2

我有以下文件cumsum_bounded.cpp

#include <Rcpp.h>
using namespace Rcpp;

//' Cumulative sum.
//' @param x numeric vector
//' @param low lower bound
//' @param high upper bound
//' @param res bounded numeric vector
//' @export
//' @return bounded numeric vector
// [[Rcpp::export]]
NumericVector cumsum_bounded(NumericVector x, double low, double high) {
    NumericVector res(x.size());
    double acc = 0;
    for (int i=0; i < x.size(); ++i) {
        acc += x[i];
        if (acc < low)  acc = low;
        else if (acc > high)  acc = high;
        res[i] = acc;
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

然后我构建并重新加载并测试我的新功能.

cumsum_bounded(c(1, -2, 3), low = 2, high = 10)
[1] 1 0 3
Run Code Online (Sandbox Code Playgroud)

然后我构建文档. devtools::document()

当我的Build & Reload一切编译好.

但是当我跑步时cumsum_bounded(c(1, 2, 3), low= 2, high = 10)我得到了错误:

Error in .Call("joshr_cumsum_bounded", PACKAGE = "joshr", x, low, high) : 
  "joshr_cumsum_bounded" not available for .Call() for package "joshr"
Run Code Online (Sandbox Code Playgroud)

NAMESPACE

# Generated by roxygen2: do not edit by hand

export(cumsum_bounded)
Run Code Online (Sandbox Code Playgroud)

更新:

如果我按上面创建一个新项目并且不使用该Build & Reload函数,而是使用devtools :: loadall(),它将起作用.但是一旦我按下那个Build & Reload按钮,它就会横向移动.

Kev*_*hey 12

你可能需要这条线

useDynLib(<pkg>) ## substitute your package name for <pkg>
Run Code Online (Sandbox Code Playgroud)

在您的NAMESPACE文件中.如果您正在使用roxygen2,您可以#' @useDynLib <pkg>在文档中的某处添加一行,并<pkg>根据需要替换您的包名称.

编辑:响应您的其他错误消息,您可能需要从Rcpp导入一些内容,例如添加行@importFrom Rcpp evalCpp.

  • 这些都是你可以避免的基本错误:a)阅读文档(我知道,我知道,......)或b)创建一个模板包. (2认同)