Как сделать ссылку на повышение date_time - PullRequest
1 голос
/ 13 марта 2019

Пример

У меня есть функция Rcpp, где я хотел бы вызвать boost::posix_time::time_from_string().

Я взял пример кода из документации по бусту и преобразовал его в функцию c ++, используя Rcpp

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, например эта строка в библиотеке 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 ...
// }

Вопрос

Как предоставить соответствующие ссылки на lboost_date_time, кроме включения заголовка posix_time.hpp, чтобы можно было использовать 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

1 Ответ

3 голосов
/ 13 марта 2019

Как вы уже узнали, вам нужно связать с бустом на системном уровне.Пакет 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... не нужны, поскольку библиотека установлена ​​в стандартном месте.Однако в других случаях эти флаги нужны.
...