Я написал функцию C++ для преобразования произвольного «data.frame», переданного из R (через Rcpp) в «CharacterMatrix». До сих пор эта функция сохраняется в файле с именем «df2String.cpp», который выглядит следующим образомПреобразовать объект «POSIX *» в «символ» с помощью Rcpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
CharacterMatrix df2String(DataFrame x) {
int nCols = x.size();
CharacterVector chContents = as<CharacterVector>(x[1]);
int nRows = chContents.size();
CharacterMatrix chOut(nRows, nCols);
for (int i = 0; i < nCols; i++) {
chContents = as<CharacterVector>(x[i]);
chOut(_, i) = chContents;
}
return chOut;
}
и дает прекрасные результаты, по крайней мере большую часть времени, например,
library(Rcpp)
sourceCpp("df2String.cpp")
df2String(beaver1)[1:5, ]
[,1] [,2] [,3] [,4]
[1,] "346" "840" "36.33" "0"
[2,] "346" "850" "36.34" "0"
[3,] "346" "900" "36.35" "0"
[4,] "346" "910" "36.42" "0"
[5,] "346" "920" "36.55" "0"
Однако, когда по крайней мере один столбец в указанное «data.frame» имеет класс «POSIX *», я получаю сообщение об ошибке ниже.
## add 'POSIX*' column
beaver1.1 <- beaver1
beaver1.1$time <- formatC(beaver1.1$time, flag = "0", width = 4)
beaver1.1$year <- 1990
beaver1.1$datetime <- paste(beaver1.1$year, beaver1.1$day, beaver1.1$time)
beaver1.1$datetime <- strptime(beaver1.1$datetime, format = "%Y %j %H%M")
df2String(beaver1.1)
Ошибка в Eval (запасной (выражение), Envir, Enclos): не совместим с STRSXP
Будучи скорее новичок Rcpp (или C++), я бы будьте благодарны за любые советы о том, как сделать C++-функцию совместимой с «POSIX *». Прямо сейчас, я улавлю колонки «POSIX *» на стороне R и преобразую их в «символ», прежде чем передавать объект на свою пользовательскую функцию C++, но мне это не кажется очень удобным.
Это происходит как с «POSIXlt», так и с «POSIXct»? «POSIXct» - это «double», поэтому, я думаю, вы получаете отформатированный номер? «POSIXlt» является «списком» внутри и, предположительно, не обрабатывается в rcpp (как преобразование «список» в «символ»). Эти классы имеют специфический метод 'as.character' и моделируют R-подобное принуждение, вам нужно либо преобразовать на R-стороне (как в настоящее время), либо построить и оценить вызов' as.character (my_POSIXlt) 'в rcpp , –
Спасибо за подсказку @alexis_laz. Действительно, функция работает с объектами «POSIXct» и не работает только для «POSIXlt». – fdetsch