我写了一个C ++函数来将从R传递的任意'data.frame'(通过 Rcpp )转换为'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中的错误(替换(expr),envir,enclos):不兼容 使用STRSXP
作为 Rcpp (或C ++)的新手,我要感谢任何关于如何使C ++函数与'POSIX *'兼容的建议。现在,我在R端捕获'POSIX *'列并在将对象传递给我的自定义C ++函数之前将它们转换为'character',但这对我来说似乎不太方便。
答案 0 :(得分:1)
您依靠通过as<CharacterVector>()
转换自动转换任何内容到角色。
您现在发现它不适用于datetime对象。欢迎使用各种类型。
您需要在代码中添加一个检测类型的分支,执行当前对整数和数字向量执行的操作,但将日期时间格式化为字符串。
此处还有其他答案显示:this is but one。我们one也有Rcpp Gallery。