【问题标题】:sugar for %in% in rcpprcpp 中 %in% 的糖
【发布时间】:2018-03-05 20:54:57
【问题描述】:

%in% 是否有 Rcpp 糖分?

例如,我在 R 中有以下语句

y <- c('XA','XB','XC','XF','XK','XL','XM','XN','XO','XP','XS','XU','XW','XY', 'DF','DS','AS','XL','FG')
x <- ifelse(y %in% c("XA","XB","XC","XF","XK","XL","XM","XN","XO","XP","XS","XU","XW","XY"),"KCA","KUS")

我正在尝试使用 ||在上面的 Rcpp 中,其中 x 和 y 都被定义为类型

std::vector<std::string> 

代码sn-p是

int n = y.size();
for (int i = 0; i < n; i++){
 if (y[i] == 'XA' ||
      y[i] == 'XB' ||
      y[i] == 'XC' ||
      y[i] == 'XF' ||
      y[i] == 'XK' ||
      y[i] == 'XL' ||
      y[i] == 'XM' ||
      y[i] == 'XN'||
      y[i] == 'XO'||
      y[i] == 'XP' ||
      y[i] == 'XS' ||
      y[i] == 'XU'  ||
      y[i] == 'XW' ||
      y[i] == 'XY' ) {x[i] = 'KCA';}
  else
  {x[i] ='KUS';}
} //end of loop

但我收到以下错误:

ambiguous overload for operator'=='(operand types are 'std::basic_string<char>' and 'int')

有糖吗

%in%

我可以在 Rcpp 中使用,或者我如何使用 ||在Rcpp这里避免错误?

【问题讨论】:

  • 我认为 %in% 的 C++ 方式是 std::find(),参见 例如 stackoverflow.com/questions/571394/…
  • 另外,欢迎使用 C++ 和字符串。你使用了一个',你需要的字符串是"。之后,您的 == 比较运算符代码应该可以工作了。
  • 是的,在将' 替换为" 后它起作用了,但为什么会这样呢?这是否意味着我不能在std::vector&lt;std::string&gt; 中使用'
  • 语言定义回到 C。' 用于单个字符,它也转换为整数,因此您看到的错误。需要字符串"
  • 要真正复制%in%,需要查看源代码。输入%in%(用单引号括起来)表明%in% 本身就是match 的糖。这是match 的主力函数。

标签: r rcpp


【解决方案1】:

查看Unofficial Rcpp API 以获取糖化in 运算符的示例。特别是,那里给出的例子是:

CharacterVector A = CharacterVector::create("a", "b", "c", "c", "e", "b", "d");

CharacterVector B = CharacterVector::create("a", "b");

LogicalVector C = in(A, B);

在你的情况下,我们可以构造:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::CharacterVector my_classify(Rcpp::CharacterVector x,
                                  Rcpp::CharacterVector table,
                                  std::string true_cond = "KCA",
                                  std::string false_cond = "KUS") {

  Rcpp::CharacterVector out = Rcpp::CharacterVector(x.size());

  Rcpp::LogicalVector cond = in(x, table);

  for(unsigned int i = 0; i < cond.size(); ++i){
     if(cond[i]) {
       out[i] = true_cond;
     } else {
       out[i] = false_cond;
     }
  }

  return out;
}

测试用例

x = c('XA','XB','XC','XF','XK','XL','XM','XN','XO','XP','XS',
      'XU','XW','XY', 'DF','DS','AS','XL','FG')
table = c("XA","XB","XC","XF","XK","XL","XM","XN",
          "XO","XP","XS","XU","XW","XY")
y = my_classify(x, table)
y
#>  [1] "KCA" "KCA" "KCA" "KCA" "KCA" "KCA" "KCA" "KCA" "KCA" "KCA" "KCA"
#> [12] "KCA" "KCA" "KCA" "KUS" "KUS" "KUS" "KCA" "KUS"

【讨论】:

  • 老问题,但也可以在official documentation 中找到。
  • doxygen 文档缺少示例,而且导航起来很痛苦。不确定我会在那里链接。
  • 绝对同意。同样,我发现这些示例(通常由 Dirk 等人引用)令人难以阅读,并且需要阅读的内容超出了必要的范围。我认为这可能是由于 R 目前强制执行的文档样式的限制。但即便如此,我觉得它可能会更好,尤其是当有这么多奇妙的功能可以让人们的生活变得更轻松时(直到一个人进入 std)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多