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
>
此代码在
#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
>