#r #rcpp #boost-date-time
#r #rcpp #повышение-дата-время #увеличить-дату-время
Вопрос:
Пример
У меня есть функция Rcpp, которую я хотел бы вызвать boost::posix_time::time_from_string()
.
Я взял пример кода из документации по boost и перевел его в функцию 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. Посмотрите, является ли мой (старый !!)
RcppBDT
— который многое делает с Boost Date_Time — или, конечно, с помощью всеми любимого конвертераanytime
.2. О, извините, возможно, вы пропустили ту часть, где для преобразования / форматирования строк с помощью Boost требуется связывание , поэтому два вышеупомянутых пакета этого не делают. Это есть в документах Boost Date_Time, но несколько скрыто. Для них связывание является нормальным; использовать с пользой и переносимостью header-только это не так.
3. В отсутствие прямого решения я на самом деле использую вашу
stringToTime()
функцию на данный момент. (как я вижу, вы обошлиtime_from_string()
обаanytime
иRcppBDT
)4. Вы можете свободно использовать функцию Boost , если и когда вы также создаете ссылку . Проще всего разобраться в программе на C из пяти строк в командной строке. Я не налагаю ограничений.
Ответ №1:
Как вы уже выяснили, вам нужно связать с boost на системном уровне. Пакета BH недостаточно. Итак, сначала вам нужно установить необходимую библиотеку boost. В системах 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...
не нужны, поскольку библиотека установлена в стандартном расположении. Однако эти флаги нужны в других случаях.