【发布时间】:2016-11-21 11:16:40
【问题描述】:
我编写了一个 C++ 函数,用于将从 R(通过 Rcpp)向下传递的任意“data.frame”转换为“CharacterMatrix”。到目前为止,该函数存储在一个名为“df2String.cpp”的文件中,如下所示
#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(substitute(expr), envir, enclos) 中的错误:不兼容 使用STRSXP
作为 Rcpp(或 C++)的新手,我非常感谢有关如何使 C++ 函数与“POSIX*”兼容的任何建议。现在,我在 R 端捕获“POSIX*”列并将它们转换为“字符”,然后再将对象传递给我的自定义 C++ 函数,但这对我来说似乎不太方便。
【问题讨论】:
-
“POSIXlt”和“POSIXct”是否都会发生这种情况? “POSIXct”是一个“双”,所以,我猜,你得到一个格式化的数字返回? “POSIXlt”在内部是一个“列表”,并且可能不在 rcpp 中处理(作为“列表”到“字符”的转换)。这些类具有特定的
as.character方法,并且要模拟类似 R 的强制转换,您必须在 R 端进行转换(如当前所做的那样)或在 rcpp 中构建和评估as.character(my_POSIXlt)调用。 -
感谢@alexis_laz 的提示。实际上,该函数适用于“POSIXct”对象,仅适用于“POSIXlt”。