可能有幾種不同的方式來處理這一點,但這裏有std::transform
一個選項:
#include <Rcpp.h>
using namespace Rcpp;
struct Functor {
std::string
operator()(const std::string& lhs, const internal::string_proxy<STRSXP>& rhs) const
{
return lhs + rhs;
}
};
// [[Rcpp::export]]
CharacterVector paste2(CharacterVector lhs, CharacterVector rhs)
{
std::vector<std::string> res(lhs.begin(), lhs.end());
std::transform(
res.begin(), res.end(),
rhs.begin(), res.begin(),
Functor()
);
return wrap(res);
}
/*** R
lhs <- letters[1:2]; rhs <- letters[3:4]
paste(lhs, rhs, sep = "")
# [1] "ac" "bd"
paste2(lhs, rhs)
# [1] "ac" "bd"
*/
其原因第一複印左手錶達成std::vector<std::string>
在於internal::string_proxy<>
類provides operator+
與簽名
std::string operator+(const std::string& x, const internal::string_proxy<STRSXP>& y)
而不是,例如
operator+(const internal::string_proxy<STRSXP>& x, const internal::string_proxy<STRSXP>& y)
如果你的編譯器支持C++ 11,這是可以做到稍微乾淨:
// [[Rcpp::plugins(cpp11)]]
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterVector paste3(CharacterVector lhs, CharacterVector rhs)
{
using proxy_t = internal::string_proxy<STRSXP>;
std::vector<std::string> res(lhs.begin(), lhs.end());
std::transform(res.begin(), res.end(), rhs.begin(), res.begin(),
[&](const std::string& x, const proxy_t& y) {
return x + y;
}
);
return wrap(res);
}
/*** R
lhs <- letters[1:2]; rhs <- letters[3:4]
paste(lhs, rhs, sep = "")
# [1] "ac" "bd"
paste3(lhs, rhs)
# [1] "ac" "bd"
*/
太好了,謝謝你 – user3507085
爲了更好地理解,你能就如何'內部發表簡短評論:: string_proxy&'與'String'有關,爲什麼不能使用'String'? –
NoBackingDown
@Dominik總之,他們並不真正相關; 'string_proxy'基本上是一個輕量級的包裝類(即,[* proxy * class](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Temporary_Proxy)),當單個元素[在一個'Vector'](https://github.com/RcppCore/Rcpp/blob/master/inst/include/Rcpp/vector/Vector.h#L324-L346)。這種方法可以在沒有實際存儲(「擁有」)的情況下修改'CHARSXP'或'const char *'(假定)與附加功能(例如多重構造函數,操作符重載等) '本身。 – nrussell