有一个关于Rccp-dev
的讨论,讨论如何将字符串结果转换为RawVector(请参见https://lists.r-forge.r-project.org/pipermail/rcpp-devel/2010-October/001179.html)。
// [[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
中的rawToChar
函数?
> rawToChar ( charToRaw("hello friend") )
[1] "hello friend"
澄清
与上面的rawToChar
和charToRaw
代码类似,我希望具有以下内容:print_hello(say_hello())
,其应输出"hello friend"
。
也就是说,我尝试从R传入一个原始向量,并让它将原始格式转换为std:string:
一次尝试失败
// [[Rcpp::export]]
std::string print_hello(const RawVector& raw)
{
// https://stackoverflow.com/questions/8421250/convert-rcppcharactervector-to-stdstring
std::string res = Rcpp::as<std::string>(raw);
return res ;
}
另一次尝试失败(这是我要查找的格式)
这里我包括了Rccp序列化API:#include "RApiSerializeAPI.h"
#include "RApiSerializeAPI.h
std::string print_hello(const RawVector raw)
{
// https://github.com/eddelbuettel/rcppredis/blob/master/src/Redis.cpp
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)
{
// https://github.com/eddelbuettel/rcppredis/blob/master/src/Redis.cpp
Rcpp::RawVector raw = (TYPEOF(s) == RAWSXP) ? s : serializeToRaw(s);
std::string res = unserializeFromRaw(raw);
return res ;
}
有一个关于static_cast
的引用,我也不理解,目标是:将RawVector转换为std::字符串
我在沃茨中游泳,只是想寻求一点指导。
Windoze信息
/*
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
*/
德克的回答
> 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"
### BAFFLING ### Windoze!?<!?
> 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"
1条答案
按热度按时间ckx4rj1h1#
正如评论中所暗示的,答案隐藏在RcppRedis包中,我只是从该包中借用了这一实际的一行程序(为了便于显示,我将其分成三行):
我们基本上只是要求C++将原始字符“视为"标准字符。R本身可能也有一个C函数可以借用。这对我很有效,显然至少从2014年开始。