【问题标题】:Is there a C++ way of implementing/equivalent of the which() function in R? [duplicate]是否有 C++ 方法来实现/等效 R 中的 which() 函数? [复制]
【发布时间】:2021-12-09 04:59:31
【问题描述】:

我正在用 C++ 重写一个 R 程序。我想知道是否存在与 R 中的 which() 函数相同的 c++ 等效项或方法。这是 which() 函数有效完成的:

# A sequence 
x <- c(10, 20, 30, 40, 50)
# This should return a numerical index (1, 2) since only the first two elements are <= 20
which(x <= 20)

所以which() 本质上是测试表达式并返回逻辑对象的 TRUE 索引。我尝试搜索Rcpp 糖,但似乎找不到。有which_max()which_min(),它们分别返回最大和最小元素的数字索引。我总是可以在 Rcpp 中使用 R 函数,但我有兴趣学习 c++ 方式如果可能

【问题讨论】:

  • POC:你应该有which(x &lt;= 20)而不是which(x =&lt;20)
  • 您可能看得太细了。考虑一下您打算如何处理这些索引。实现相同结果的 C++ 方法可能比您想象的要高一个级别;它可能是实现您计划做的下一件事,而不是沿途复制这一特定步骤。 (例如,有几个标准算法具有_if 形式,基本上将x &lt;= 20 作为参数。这些算法将仅对which 将返回的索引进行操作,跳过其中的部分你可以看到索引。)
  • 语言之间通常没有一对一的映射,因为它们有非常不同的设计理念。从一种语言转换到另一种语言时,您通常也需要重塑自己的思维(这也意味着放弃以前语言中一些最喜欢的结构)
  • here 给出的答案也确实解决了手头的问题
  • 请尝试使用[rcpp[ which is:question 进行搜索(是的,使用方括号和冒号,这些是 StackOverflow 的问题运算符),因为已提出此问题,并回答了 multiple 次之前。

标签: c++ r rcpp


【解决方案1】:

目前我手头没有兼容 C++20 的编译器,所以我没有对此进行测试。 但是使用 C++20 和范围,您应该能够执行以下操作: 请注意,这不会返回索引,而是返回实际值的视图。

#include <iostream>
#include <ranges>

// setup a predicate
auto which = [](const int& value ) { return value <= 20; };

int main()
{
    // or you can use std::vector
    std::array x{10,20,30,40,50};

    // create a filtered result
    auto result  = x | std::views::filter(which);

    return 0;
}

【讨论】:

  • 这虽然是真的,但不是 Rcpp 答案。查看问题的上下文。
  • 但这是一个简单的 C++ 答案。不依赖于外部库,我认为在这种情况下这是一个有效的解决方案。
  • 我主要是建议将其包装在可从 Rcpp 调用的东西中(而不是 main),这是 OP 所要求的。详细信息-感谢答案。这个问题很常见,实际上是重复多次。
  • 哦,现在我明白你的意思了。但 op 并没有要求这样做。他问如何用 c++ 重写它,而不是让它可以从 r 调用
  • 好吧,他通过rcpp 标签和'from R'上下文隐含地做到了。但我承认这对我来说很清楚,但对于通过c++ 标签拉进来的人来说则不太清楚。一切都好。
猜你喜欢
  • 2011-09-28
  • 2012-04-10
  • 1970-01-01
  • 2011-04-07
  • 2022-12-10
  • 1970-01-01
  • 2018-07-19
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多