在 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);
}')
我想将 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);
}')