问题标签 [rcpp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
424 浏览

oop - 将 RInside 的“R”实例作为类/方法之间的参数传递

我一直在使用 Rcpp 和 RInside 来集成RC++。我们有一个复杂但设计良好的 C++ 架构,我发现很难从一个函数中访问 R。是否可以将R 实例传递给不同的类/函数,以获得更多的 OOP 设计?如果是,有没有例子?

为了详细说明查询,我想说这样的话,


我目前注意到的是,每次调用 foo,可能会创建一个新的 RInside 实例。

谢谢 - 埃贡

0 投票
1 回答
3997 浏览

r - 在 R 中,此错误的常见情况是什么:“SET_STRING_ELT() 的值必须是‘CHARSXP’而不是‘字符’”

我正在与 R 中的一个奇怪问题作斗争。我使用旧版本的 Rcpp 将 R 与一些 C++ 集成(遗憾的是升级不是一个选项!),我使用的 Rcpp 是旧的 RccpTemplate 。但是我怀疑问题就在那里。

我有一些大部分时间运行良好的 R 代码,但有时(尤其是在处理大量数据时)会神秘地失败Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

它总是在列表操作中失败,例如:

但是,如果我options(error=recover)在错误后使用并尝试相同的操作,则可以毫无问题地执行分配。C++ 只处理数字向量,实际上在时间上与失败的分配代码相去甚远。

所以我的模糊问题是:这种行为的最常见原因是什么?记性不好?坏对象(也许是坏的RcppResultSet)?我在解决这个问题时遇到了麻烦......

为了完整性:

0 投票
1 回答
547 浏览

r - RInside: parseEvalQ 'Parse Error' 会导致每次对 parseEvalQ 的后续调用都给出'Parse Error',即使处理了异常也是如此

我的代码尝试通过 C++ 模拟 R shell,它允许用户通过 tcp 连接发送 R 命令,然后在运行时通过 RInside::parseEvalQ 函数将这些命令传递给 R 实例。我必须能够处理格式错误的命令。每当一个错误的命令作为 parseEvalQ 的参数给出时,我就会捕获抛出的运行时错误(查看 RInside.cpp,我的特定错误在 parseEval(const string&, SEXP) 函数中被标记为 'PARSE_ERROR' 'status'),what()给出“St9exception”异常。

我有两个问题,第一个比第二个更紧迫:

1个。在初始解析错误之后,任何对 parseEvalQ 的后续调用都会导致另一个解析错误,即使参数有效也是如此。解析错误是否以某种方式破坏了嵌入式 R 实例?

1b。RInside 文档建议使用 Rcpp::Evaluator::run 处理 C++ 中的 R 异常(我怀疑在调用 parseEval(const string&, SEXP) 期间在 R 实例中的某个地方抛出异常,然后它返回错误状态 'PARSE_ERROR ')。我尝试过尝试使用它,但在网上找不到如何实际使用 Rcpp::Evaluator::run 的示例。

2. 在我的程序中,我将 stdout 和 stderr(在 C++ 级别)重新路由到我的 tcp 连接的文件描述符,来自 RInside 实例的任何错误消息都会发送到控制台,但是常规输出不会。我发送 RInside 命令 'sink(stderr(), type="output")' 以将 stdout 重新路由到 stderr(因为 stderr 似乎出现在我的控制台中),但仍然没有显示常规输出。'print(command)' 有效,但我想要一种更简洁的方式将标准输出直接传递到控制台,就像在普通的 R shell 中一样。

任何帮助和/或想法将不胜感激。我的代码的精简版本如下所示:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

0 投票
2 回答
2560 浏览

c++ - R:使用内联包时的 C++ 优化标志

在 R 中使用内联包中的 cxx 函数时,如何更改 cpp 编译器的优化标志?

默认情况下,在我的机器上,它使用-g -O2. 但我想使用-O3优化来提高速度。Rcpp如果这有什么不同,我会使用插件。

我尝试创建自己的插件,并且尝试设置 cxxfunction 的不同参数,但没有任何效果。

我想一种选择是使用R CMD SHLIB而不是使用cxxfunction. 但是 Rcpp 推荐使用 of,inline因为他们的大多数测试用例都在使用它。

感谢您的帮助,如果您需要任何说明,请告诉我

0 投票
1 回答
319 浏览

c++ - 如何在 Rcpp 函数中更改 R 结构的值

我有一个 R 中的向量列表列表,结构如下:

当我将 A 传递给 Rcpp 函数时,

但是A(i)(j)(n)不会改变的值仍然是0,任何人都知道是什么问题吗?

谢谢,我无法更改A[[i]][[j]][[n]]

0 投票
1 回答
11491 浏览

r - Rcpp矩阵:循环遍历行,一次一列

这是我第一次尝试 Rcpp,这个非常简单的问题给我带来了麻烦。我想使用嵌套的 for 循环对矩阵的各个值进行操作,一次一列。我的目标是这样的脚本:

所需的输出将是这样的:

问题显然出在这一行,我不知道如何引用矩阵的各个元素。

抱歉,如果这是一个愚蠢的新手问题。任何提示将不胜感激!

0 投票
1 回答
2169 浏览

r - Rcpp 的基本文档

我想研究 rcpp 以提高我的一些 R 代码的速度,而不必求助于凌乱的 C++ 代码(我在这方面取得了一些成功,但它看起来像是来自地狱的代码)。

因此,我检查了 Rcpp 提供的文档,以及Dirk Eddelbuettel 网站上提供的文档包。我安装并查看了 RcppExamples,但是(至少从它的文档中)其中大多数都指的是 RcppClassic?。除此之外,我进行了一些谷歌搜索,但这并没有得到看似基本问题的答案。

  • Rcpp 中的索引是从零开始还是从一开始
  • List 同时提供operator()and operator[],但显然不是 operator[[]]。目前尚不清楚哪些[][[]]R中的和相似。
  • Rcpp 中的因素是否有任何支持(似乎没有)?

注意:事实上,我从 Rcpp-introduction.pdf 的第一个示例中找到了一些答案,但这感觉就像运气一样。

另外,我stl的很生疏,所以如果有人可以为我提供一个简单的示例,其中 List 的每个元素都是 (eg) print-ed 带有 stl 样式的循环,那就太好了。

如果有人因为找不到此信息而想称我为白痴:继续努力吧。然后制作我的并指向我需要的文档:-)

作为对 Eddelbuettel 先生和其他 Rcpp 作者的建议(我希望他们中的一些人能读到这篇文章):doxygen 提供的类层次结构等在你已经深入 Rcpp 时非常整洁,但对于初学者(在Rcpp),我更感兴趣的是“这个类中的这个方法就像 R 中的那个函数一样”,而不是“你可以在这个头文件中找到这个运算符的声明”。毕竟,我了解 Rcpp 的目标之一是降低在 R 中使用 C++ 的门槛?注:就我所见所闻,我非常看重Rcpp的实际代码,对它的创造者表示最崇高的敬意。如果缺乏基本文档仅仅是“缺乏资源”的结果,我愿意成为一种资源(例如:在“基本”上工作

0 投票
3 回答
3722 浏览

r - 通过雪在并行代码中使用 Rcpp 来创建集群

我已经编写了一个函数Rcpp并用inline. 现在,我想在不同的内核上并行运行它,但我遇到了一个奇怪的错误。这是一个最小的示例,该函数funCPP1可以自行编译并运行良好,但不能被snow'sclusterCall函数调用。该函数作为单个进程运行良好,但在并行运行时会出现以下错误:

这是一些代码:

0 投票
5 回答
2095 浏览

c++ - R数据帧和c++中的which.min()等价物

我正在将 R 代码翻译成 c++,我想找到一个等效的(最佳)结构,它允许与数据帧相同类型的操作,但在 c++ 中。

操作是:

  • 添加元素(行)
  • 从索引中删除元素(行)
  • 获取最小值的索引

例如:

当我使用 Rcpp 时,Rcpp::DataFrame 可能是一个选项(我不知道我会怎么用 which.min 它),但我想这对于任务来说相当慢,因为这些操作需要重复很多次并且我不需要将它运回 R。

编辑:

目标。只是说清楚这里的目标是提高速度。这是将代码从 R 转换为 C++ 的明显原因(可能还有其他原因,这就是我澄清的原因)。但是,维护和易于实施排在第二位。

操作更精确。算法是:向数组中添加大量数据(多行),然后提取最小值并将其删除。重复。这就是为什么我不会选择排序向量,而是总是根据需要搜索最低数据,因为数组经常更新(添加)。我认为它更快,但也许我错了。

0 投票
1 回答
3703 浏览

c++ - 如何使用 Rcpp 和内联设置 g++ 编译器标志?

我想设置-std=c++0x,使用带有内联的 Rcpp。

在使用内联包时看到了 R: C++ Optimization 标志,但不想在系统范围内进行更改,所以我在 Dirk 的回答中尝试了选项 2。

我试过了:

但是详细的输出表明它忽略了这一点。我也尝试使用 CFLAGS,并且不包括现有值,但没有效果。