R C++函数不可用

R C++函数不可用,r,rcpp,devtools,roxygen2,R,Rcpp,Devtools,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 numer

我有以下文件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;
}
然后我构建文档。 devtools::文档

当我构建并重新加载时,一切都可以正常编译

但是当我运行cumsum_boundedc1,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"
名称空间

# Generated by roxygen2: do not edit by hand

export(cumsum_bounded)
更新:


如果我像上面那样创建一个新项目,并且不使用Build&Reload函数,而是使用devtools::loadall,那么它会工作的。但一旦我按下Build&Reload按钮,它就会向侧面移动。

您可能需要这条线

useDynLib(<pkg>) ## substitute your package name for <pkg>
在名称空间文件中。如果您使用的是roxygen2,您可以在文档中的某个位置添加一行,例如@useDynLib,并根据需要将包名替换为


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

运行文档时更新了哪些文件?您可能需要添加标记devtools-因为Rcpp本身可以按文档进行工作。我们也不会说devtools的好坏。我只需要运行Rcpp::compileAttributes命令。@DirkEddelbuettel“构建和重新加载”按钮执行Rcpp::compileAttributes。@nrussell cumsum_bounded.rdo如果您是RStudio用户,只需将devtools放在一边,然后执行文件->新建项目以选择“创建包”并选择Rcpp。信息技术将只是工作然后添加您的代码。cumsum_boundedc1,2,3中的错误,低=1,高=3:函数“EnterngScope”不是由包“Rcpp”提供的谢谢您提供的解决方案。这些都是基本错误,您可以通过阅读文档来避免,我知道。。。或者创建一个模板包。我认为有一个c@DirkEddelbuettel-忘记了当你让roxygen2生成名称空间文件时,你需要在某处使用该指令。如果你从头开始,你可能会这样做,但是当你从遗留代码中移动东西时,这种细节会从裂缝中滑出来。@ DrkdDelbutelt:我通常创建PURE R包,然后在需要的地方喷洒C++片段。使用模板包不适用于这种情况。当然,医生仍然是。
useDynLib(<pkg>) ## substitute your package name for <pkg>