在 data.frame 个名称上使用 Rcpp 糖

Using Rcpp sugar on data.frame names

我想将 data.frame 作为参数传递给带有可选列的 Rcpp 函数。然后 c++ 函数需要测试列是否存在。如果我在下面的例子中使用 sugar 函数 any,我会得到一个编译错误。

cppFunction(
  'double test(DataFrame test_data) {
      double x=NA_REAL;
      CharacterVector colnames = CharacterVector::create("foo");
      CharacterVector df_names = test_data.names();
      if (any(df_names == colnames)) x = 1.0;
      return(x);
    }')

invalid use of incomplete type class Rcpp::sugar::forbidden_conversion`

我知道我可以在一个循环中一个一个地测试字符值,就像这样(按预期工作):

cppFunction(
  'double test(DataFrame test_data) {
      double x=NA_REAL;
      CharacterVector colnames = CharacterVector::create("foo");
      CharacterVector df_names = test_data.names();
      for (int i=0; i<df_names.length(); i++) {
        if (df_names[i] == colnames[i]) x = 1.0;
      }
      return(x);
    }')
test(data.frame(bar=3))
# [1] NA
test(data.frame(foo=3))
# [1] 1

但是,如果可能的话,我想使用矢量化的“糖”版本。我做错了什么,我该怎么做?

您可以添加 is_true to return a boolean:

library(Rcpp)
cppFunction(
  'double test(DataFrame test_data) {
      double x=NA_REAL;
      CharacterVector colnames = CharacterVector::create("foo");
      CharacterVector df_names = test_data.names();
      if (is_true(any(df_names == colnames))) x = 1.0;
      return(x);
    }')