Я пишу пакет R для предоставления вспомогательных функций отладки для gdb
для печати значений переменных R
s SEXP
и Rcpp
s типы данных.
C / C ++ - это строго типизированный язык, но я хочу избежать запроса внутреннего типа данных SEXP
и использовать кучу if
для жестко заданной диспетчеризации.
Как я могу реализовать универсальную функцию подмножества, используя диапазон индекса через сигнатуру функции, подобную этой:
SEXP dbg_subset(SEXP x, R_xlen_t index_from, R_xlen_t index_to);
Одним из возможных решений было бы написать указанную выше функцию для каждой возможной подписи, например. для INTSXP
, LGLSXP
, _10 _... но я ленив ;-)
Примечание. Я не могу использовать шаблоны C ++, потому что компоновщик будет создавать экземпляры шаблонов только для типов данных, используемых в моем коде C ++ (которые не такие, как в «отлаживаемой библиотеке»), а gdb
не является компилятором, который мог бы создавать отсутствующие экземпляры шаблона "на лету", когда выражения C ++ вводятся для запроса переменных.
Изменить: см. этот ответ (но он основан на шаблонах, которых я хочу избежать):
std::copy
копирует от начала до конца минус 1, поэтому последний элемент отсутствовал (легко исправить); проверка диапазона индексов необходима для предотвращения ошибок сегментации; атрибуты должны всегда сохраняться (по крайней мере, R делает);data.frame
подмножество возвращает неправильный результат (подмножества столбцов, а не строк, посколькуRCPP_RETURN_VECTOR
знает только списки, но неdata.frame
) 24.11.2019