【问题标题】:Convert 'POSIX*' object to 'character' using Rcpp使用 Rcpp 将 'POSIX*' 对象转换为 'character'
【发布时间】: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”。

标签: r rcpp


【解决方案1】:

您依赖于通过as&lt;CharacterVector&gt;() 转换自动转换成字符。

您现在发现它不适用于日期时间对象。欢迎使用类型。

您需要在代码中添加一个分支来检测类型,执行您当前对整数和数字向量所做的工作,但将日期时间格式化为字符串。

这里还有其他答案显示:this is but one。我们还有oneRcpp Gallery

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多