R Rcpp std::transform 失败

R Rcpp std::transform fail

此代码在 中有效,但现在无效。它报告没有匹配函数来调用转换。现在查找标准代码有问题吗?

#include <Rcpp.h>

using namespace Rcpp;  

// [[Rcpp::export]]
NumericVector vecpow(const NumericVector base, const NumericVector exp) {
  NumericVector out(base.size());
  std::transform(base.begin(), base.end(),
                 exp.begin(), out.begin(), ::pow);
  return out;
}

/*** R
vecpow(c(0:3), c(4:1))
***/

我找到了一个解决方案 ,其中涉及用 static_cast<double(*)(double, double)>(::pow) 替换 ::pow 至少,它适用于上面的代码。

是的,我们周围的世界确实时不时地发生变化。

如果你咨询了C++ reference you see that std::transformed has changed。我现在还不是语言律师,看不出它不喜欢 std::pow 的地方(虽然我 可以 告诉你你打错了(C 级) ::pow) 但这里有两个 通过使用 lambda 函数 和另一个较旧的答案一样工作。

代码

#include <Rcpp.h>

// [[Rcpp::export]]
std::vector<double> vecpow(const std::vector<double> base,
                           const std::vector<double> exp) {

    std::vector<double> out(base.size());
    std::transform(base.begin(), base.end(), exp.begin(), out.begin(),
                   [&](double lhs, double rhs) -> double { 
                                        return std::pow(lhs, rhs); });
    return out;
}

// [[Rcpp::export]]
Rcpp::NumericVector vecpow2(Rcpp::NumericVector base, Rcpp::NumericVector exp) {

    Rcpp::NumericVector out(base.size());
    std::transform(base.begin(), base.end(), exp.begin(), out.begin(),
                   [&](double lhs, double rhs) -> double {
                                        return std::pow(lhs, rhs); });
    return out;
}

/*** R
vecpow(0:3, 4:1)
vecpow2(0:3, 4:1)
*/

输出

> Rcpp::sourceCpp("answer.cpp")

> vecpow(0:3, 4:1)
[1] 0 1 4 3

> vecpow2(0:3, 4:1)
[1] 0 1 4 3
>