如何在Rcpp中实现RawVector与std::string的双向转换?
在Rcpp中实现RawVector与std::string的双向转换
在Rcpp-dev社区中有关于如何将字符串转换为RawVector的讨论。
// [[Rcpp::export]] RawVector say_hello() { std::string res = "hello friend"; RawVector raw( res.size() ) ; std::copy( res.begin(), res.end(), raw.begin() ) ; return raw ; }
该代码运行符合预期:
> Rcpp::sourceCpp( paste0(wd, "src/base64.cpp") ); > say_hello() [1] 68 65 6c 6c 6f 20 66 72 69 65 6e 64 > charToRaw("hello friend") [1] 68 65 6c 6c 6f 20 66 72 69 65 6e 64
问题:如何在Rcpp中实现反向转换?
如果我有一个RawVector,如何将其转换为std::string?也就是在Rcpp中实现R语言里rawToChar函数的功能?
> rawToChar ( charToRaw("hello friend") ) [1] "hello friend"
说明
类比上述rawToChar和charToRaw的代码,我希望实现:print_hello(say_hello()),其输出应为"hello friend"。
即我尝试从R传入一个raw向量,并在Rcpp中将其转换为std::string:
失败尝试一
// [[Rcpp::export]] std::string print_hello(const RawVector& raw) { // 尝试参考字符向量转std::string的方法 std::string res = Rcpp::as<std::string>(raw); return res ; }
失败尝试二(目标格式)
此处引入了Rcpp序列化API:#include "RApiSerializeAPI.h"
#include "RApiSerializeAPI.h" std::string print_hello(const RawVector raw) { std::string res = unserializeFromRaw(raw); return res ; }
错误信息:
base64.cpp:155:38: error: conversion from 'SEXP' {aka 'SEXPREC*'} to non-scalar type 'std::string' {aka 'std::__cxx11::basic_string<char>'} requested 155 | std::string res = unserializeFromRaw(raw);
最后一次尝试,同样失败
std::string print_hello(SEXP s) { Rcpp::RawVector raw = (TYPEOF(s) == RAWSXP) ? s : serializeToRaw(s); std::string res = unserializeFromRaw(raw); return res ; }
我还尝试过参考static_cast相关内容,但不太理解。我的核心目标就是:将RawVector转换为std::string,现在陷入了困境。
Windows环境信息
/* g++ -std=gnu++11 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -I"C:/Users/......./AppData/Local/R/WIN-LI~1/4.2/Rcpp/include" -I"C:/_git_/github/......./src" -I"C:/_git_/github/......./inst/include" -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c base64.cpp -o base64.o R_RTOOLS42_PATH C:\rtools42/x86_64-w64-mingw32.static.posix/bin;C:\rtools42/usr/bin "pkg.version(Rcpp)" [1] ‘1.0.9’ > R.version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 crt ucrt system x86_64, mingw32 status major 4 minor 2.1 year 2022 month 06 day 23 svn rev 82513 language R version.string R version 4.2.1 (2022-06-23 ucrt) nickname Funny-Looking Kid */
Dirk的解答结果
> r = (charToRaw("The quick brown fox")) > r [1] 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78 > r2c(r) [1] "The quick brown fox" > r2c(charToRaw("The quick brown fox")) [1] "The quick brown fox\xd2\xce\002" ### 令人困惑 ### Windows系统问题? > r <- charToRaw("The quick brown fox") > r2c(r) [1] "The quick brown fox\xdb\xce\002" > r = (charToRaw("The quick brown fox")) > r2c(r) [1] "The quick brown fox"
内容的提问来源于stack exchange,提问作者mshaffer
相关产品推荐
相关产品推荐

