降价中的 Rcpp

Posted

技术标签:

【中文标题】降价中的 Rcpp【英文标题】:Rcpp in markdown 【发布时间】:2018-10-04 11:45:20 【问题描述】:

我正在尝试使用在 Rmarkdown 文档中使用 Rcpp 包创建的函数。但是以下会导致错误:

```Rcpp firstChunk
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```

C:/Rtools/mingw_64/bin/g++ -I"C:/Users/JAKMIC~1/DOCUME~1/R/R-35~1.1/include" -DNDEBUG -I"C:/Users/jakmicha1 /Documents/R/R-3.5.1/library/Rcpp/include"-I"C:/Users/jakmicha1/AppData/Local/Temp/RtmpQBQexm/sourceCpp-x86_64-w64-mingw32-0.12.18"-O2-墙 -mtune=generic -c file17ec52d61f75.cpp -o file17ec52d61f75.o file17ec52d61f75.cpp:1:1:错误:“Rcpp”没有命名类型 Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) ^ 制作:*** [C:/Users/JAKMIC~1/DOCUME~1/R/R-35~1.1/etc/x64/Makeconf:215:file17ec52d61f75.o] 错误 1 Rcpp::sourceCpp(code = "Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) \n return x + x;\n") 中的错误: 构建共享库时出现错误 1。

可能是什么原因,我该如何解决?

编辑:

感谢所有回复。运行块时代码似乎可以正常工作。编织时出现错误。

---
title: "title"
output: pdf_document
---

```Rcpp firstChunk
#include <Rcpp.h>

//[[Rcpp::export]]
Rcpp::IntegerVector double2Me(Rcpp::IntegerVector x) 
  return x + x;

```

```r callFirstChunkInR
double2Me(c(2, 2))
```
# In command 'system(cmd)': 'make' not found

# Quitting from lines 7-13 (title.Rmd) 
# Error in command '(function (file = "", code = NULL, env = globalenv(), embeddedR = TRUE, ':
#  Error 1 occurred building shared library.
# Calls: <Anonymous> ... block_exec -> in_dir -> engine -> do.call -> <Anonymous>

我在 Windows 7 和 Rcpp_0.12.19 上的 RStudio 1.1.456 中使用 Rmarkdown 1.10。有什么想法吗?

【问题讨论】:

您错过了几千个现场示例,包括(当然)在 Rcpp Gallery 中运行 Rmarkdown 编写的 Rcpp 代码示例。 您需要将Rtools 3.5安装在默认位置C:/Rtools,c.f. thecoatlessprofessor.com/programming/… 我已经安装好了。 确保 Rtools 尝试在您的路径中插入的值位于开头。 【参考方案1】:

R-markdown 中的 Rcpp 块等价于Rcpp::sourceCpp,而不是Rcpp:cppFunction。因此,您必须指定必要的包含并告诉 Rcpp 导出函数:

```Rcpp firstChunk
#include <Rcpp.h>
//[[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```

【讨论】:

谢谢。它在运行大块时确实有效,但在编织时不起作用。我编辑了我的帖子,但返回错误。 @jakes 请为此新错误消息提供minimal reproducible example。 我已经编辑了整个文档。不知道是否相关,但我在 Rstudio 中使用 Rmarkdown @jakes 您的示例文档对我来说运行良好(Debian Linux,R 3.5.1,RStudio 1.2.907,Rcpp 0.12.19,rmarkdown 1.10)。 我用的是Windows 7,RStudio 1.1.456,其他都一样。可能是因为 Windows 出了什么问题?【参考方案2】:

您必须在代码块中添加#include &lt;Rcpp&gt;,并且很可能还将// [[Rcpp:export]] 指令添加到您的函数中。

像这样:

```Rcpp firstChunk
#include <Rcpp.h>

//[[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```

【讨论】:

谢谢。它在运行大块时确实有效,但在编织时无效。我编辑了我的帖子,但返回错误。【参考方案3】:

您只是省略了包含Rcpp.h[[Rcpp::export]] 属性来创建函数并将其链接到R

```Rcpp firstChunk
#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```

在另一个块中,您可以使用引擎调用 Rcpp 函数 R.

```r callFirstChunkInR
doubleMe(c(2, 2))
```

有关在 R Markdown 文档中使用不同引擎的更多信息,请访问:

R Markdown: The Definitive Guide - Chapter 2, Section 2.7 Other language engines

R Markdown 中的 Rcpp 示例

您可以在此处找到我以前的一些so 答案 RMarkdown 文件使用Rcpp

https://github.com/coatless/so

RMarkdown 文档的渲染

【讨论】:

相当大的字体文件,但把答案带回家。 SO repo 也是个好主意。 macOS Retina 显示屏大大增加了屏幕截图的大小...我现在已经对其进行了调整。 谢谢。它在运行大块时确实有效,但在编织时不起作用。我编辑了我的帖子,但返回错误。【参考方案4】:

我有一个相关的问题,这似乎是由 RStudio Ver 1.1.442 为 RMarkdown 文件中的 Rcpp 块插入的默认块头引起的。

借用上面的 OPs 问题,这是行不通的:

```rcpp firstChunk
#include <Rcpp.h>
using namespace Rcpp;
// Function declaration with export tag
// [[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```  

当我尝试运行块时,RStudio 会产生以下错误消息:

'rcpp' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

但是,这很好用:

```Rcpp firstChunk
#include <Rcpp.h>
using namespace Rcpp;
// Function declaration with export tag
// [[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) 
  return x + x;

```  

这两段代码之间的唯一区别是块头中的“Rcpp”和“rcpp”。

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review @drhagen - 同意,它没有专门回答 OPs 问题,但它是相关的,并为任何来到 SO 寻找指针的人提供一些指导,说明他们为什么会收到关于 Rcpp 的模棱两可的消息Rmd 中的块。此外,当我上周查看时,没有一个与我的问题特别相关的问题,这个问题最接近,与此同时,我已经解决了我自己的问题 - 将解决方案放在这里让其他人受益。

以上是关于降价中的 Rcpp的主要内容,如果未能解决你的问题,请参考以下文章

MAGMA 和 Rcpp 用于 R 中的线性代数

Rcpp犰狳中的样本

Rcpp 程序中的最小值和最大值

Rcpp中的布尔向量子集向量

Rcpp 中的 lengths() 糖函数?

如何从 Rcpp 中的另一个函数调用一个函数?