各位大侠好,
请问有谁能给出一个RCpp的代码,首先对一个字符串的首位进行判断,如果是数字,就对这个字符串按照空格(\\s,包括常规空格或者\t)进行分割,然后把结果保存到一个常量里的操作吗?
谢谢!
RCpp 字符串操作
回复 第1楼 的 wuxian2r:允许用boost就很容易呀
<br />
#include <iostream><br />
#include <string><br />
#include <boost/regex.hpp><br />
#include <boost/algorithm/string.hpp><br />
#include <vector></p>
<p>std::vector<std::string> process_str(const std::string& s)<br />
{<br />
std::vector<std::string> strs;<br />
boost::regex e("^\\d.+");</p>
<p> if (boost::regex_match(s, e))<br />
{<br />
boost::split(strs,s,boost::is_any_of(" \t"));<br />
}</p>
<p> return strs;<br />
}</p>
<p>int main()<br />
{<br />
std::string s[4] = { "0033", "0000\t1111",<br />
"aaa", "000 1111",<br />
};</p>
<p> std::vector<std::string> res;<br />
for (int i = 0; i < 4; ++i)<br />
{<br />
std::cout << s[i] << "\t" << "split:\t";<br />
res = process_str(s[i]);<br />
for(size_t j = 0; j < res.size(); j++)<br />
{<br />
std::cout << res[j] << "\t";<br />
}<br />
std::cout << std::endl;</p>
<p> }</p>
<p> return 0;<br />
}<br />
</p>回复 第2楼 的 Thirdwing:LZ是要Rcpp版本,例如:R里面的数据结构,Rcpp怎么表示的
你弄个string,R传进去一个character vector 能是string么?[s:11]
回复 第3楼 的 superdesolator:
Rcpp可以做这个转换的。
回复 第4楼 的 Ihavenothing:我的意思是Rcpp可以,但是2楼不可以吧
回复 第5楼 的 superdesolator:
稍微改动一下,加上适当的Rcpp attributes注释就可以自动转换啦。
https://bitbucket.org/yixuan/cn/downloads/Rcpp_attributes.html
回复 第6楼 的 Ihavenothing:打不开,能否简单复制粘贴个例子,如果2楼能转换成Rcpp语法,那还学什么Rcpp.......
回复 第7楼 的 superdesolator:
我修改了链接,例子在第20页。这种自动转换很方便,不过也有一些限制。
回复 第7楼 的 superdesolator:
一直都可以转换呀,f1是个SEXP或者CharacterVector都没问题
<br />
std::string fname = Rcpp::as<std::string>(f1);<br />
</p>回复 第9楼 的 Thirdwing:
Ok,明白了,这些东西在Rcpp那本书上有介绍么?这么方便啊。。。我之前学了两天,全是CharacterVector这种形式,没说过可以像你这么转。。。。 转完之后可以使用 fname.size()之类的类方法么。。。。
回复 第10楼 的 superdesolator:转换过就是标准的C++类型了,和普通的string一样。
如果你觉得as和wrap支持的类型不够多,自己扩展一下就好了呀。给你个简单的例子参考:
https://github.com/thirdwing/RcppDL/blob/master/src/RcppDL.h