R-如何链接到Boost Date_time



示例

我有一个RCPP功能,我想调用boost::posix_time::time_from_string()

我从Boost文档中获取了示例代码,并使用RCPP将其转换为C 函数

library(Rcpp)
cppFunction(
  includes = '
    #include <boost/date_time/posix_time/posix_time.hpp>
  ',
  code = '
    void time_test() {
      std::string t = "2002-01-20 23:59:59.000";
      boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
      Rcpp::Rcout << "time from string: " << pt << std::endl;
    }
  ',
  depends = "BH"
)

但是,这不会编译。

我已经看过一些评论,说您需要链接到-lboost_date_time,例如Dirk的RcppBDT库中的这一行

// The next function uses the non-stream-based parsing in Boost Date_Time
// and requires _linking_ with -lboost_date_time which makes the (otherwise
// header-only) build more complicate
// // [ [ Rcpp::export ] ]
// Rcpp::DatetimeVector charToPOSIXctNS(Rcpp::CharacterVector sv) {
//   ... code omitted ...
// }

问题

除包括posix_time.hpp标头外,您如何提供与lboost_date_time的适当链接,以便可以使用time_from_string()


额外信息

可以使用boost/date_time库中的其他功能,如该功能所示,那么time_from_string()与众不同?

cppFunction(
  includes = '
    #include <boost/date_time/posix_time/posix_time.hpp>
  ',
  code = '
    void time_test() {
      Rcpp::Datetime dt("2002-01-20 23:59:59.000");
      boost::posix_time::hours h( dt.getHours() );
      boost::posix_time::minutes m( dt.getMinutes() );
      boost::posix_time::seconds s( dt.getSeconds() );
      Rcpp::Rcout << h << std::endl;
      Rcpp::Rcout << m << std::endl;
      Rcpp::Rcout << s << std::endl;
    }
  ',
  depends = "BH"
)
time_test() 
# 12:00:00
# 00:59:00
# 00:00:59

正如您已经发现的那样,您需要在系统级别上 link 。BH包还不够。因此,首先,您必须安装所需的升压库。在Debian(dervied)Linux系统上,这可以通过

完成
sudo apt-get install libboost-date-time-dev

然后,您需要告诉R将-I/path/to/boost/headers-L/path/to/boost/libraries -lboost_date_time添加到编译器标志。您可以通过设置适当的环境变量来做到这一点:

library(Rcpp)
Sys.setenv(PKG_LIBS="-L/usr/lib -lboost_date_time", PKG_CPPFLAGS="-I/usr/include")
cppFunction(
  includes = '
    #include <boost/date_time/posix_time/posix_time.hpp>
  ',
  code = '
    void time_test() {
      std::string t = "2002-01-20 23:59:59.000";
      boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
      Rcpp::Rcout << "time from string: " << pt << std::endl;
    }
  '
)

注意:

  • 也可以为此定义一个RCPP插件。
  • 在我的情况下,-I...-L...是不必要的,因为该库安装在标准位置。但是,在其他情况下确实需要这些标志。

相关内容

  • 没有找到相关文章

最新更新