降价中的 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 <Rcpp>
,并且很可能还将// [[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的主要内容,如果未能解决你的问题,请参考以下文章