RCPP в уценке - PullRequest
       13

RCPP в уценке

0 голосов
/ 04 октября 2018

Я пытаюсь использовать функцию, созданную с помощью пакета Rcpp в документе Rmarkdown.Но следующее приводит к ошибке:

```{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 -Wall -mtune = универсальный -c file17ec52d61f75.cpp -o file17ec52d61f75.o file17ec52d61f75.cpp: 1: 1: ошибка:« Rcpp »не называет типRcpp :: IntegerVector doubleMe (Rcpp :: IntegerVector x) {^ make: *** [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>

Я использую Rmarkdown 1.10 в RStudio 1.1.456 на Windows 7 и Rcpp_0.12.19.Есть идеи?

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

У меня есть связанная проблема, которая, кажется, вызвана заголовком блока по умолчанию, вставленным RStudio Ver 1.1.442 для блоков Rcpp в файл RMarkdown.

Заимствование из вопроса OPs выше, это не 't работа:

```{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" в заголовках чанка.

0 голосов
/ 04 октября 2018

Куски Rcpp в R-уценке эквивалентны Rcpp::sourceCpp, а не Rcpp:cppFunction.Поэтому вы должны указать необходимые включения и указать Rcpp экспортировать функцию:

```{Rcpp firstChunk}
#include <Rcpp.h>
//[[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) {
  return x + x;
}
```
0 голосов
/ 04 октября 2018

Вы только что пропустили включение атрибута 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: полное руководство - глава 2, раздел 2.7 Другие языковые движки

Примеры с Rcpp в R Markdown

YouЗдесь можно найти некоторые из моих предыдущих so файлов ответов RMarkdown, которые используют Rcpp здесь:

https://github.com/coatless/so

Визуализация документа RMarkdown

enter image description here

0 голосов
/ 04 октября 2018

Вы должны #include <Rcpp> в своем фрагменте кода, и, скорее всего, добавить директиву // [[Rcpp:export]] также к вашей функции.

Например:

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

//[[Rcpp::export]]
Rcpp::IntegerVector doubleMe(Rcpp::IntegerVector x) {
  return x + x;
}
```
...