在Rmarkdown中使用Rcpp时出错

时间:2015-07-13 21:31:16

标签: r rcpp r-markdown

我想将普通R-loop和循环的速度与Rcpp进行比较。我需要这个比较一个小文档,这就是为什么它必须在rmarkdown中使用。代码是:

for_R <- function(n){
  a <- 0
  for(i in 1:n){
    a = a + i
  }
  return(a)
}

Rcpp::cppFunction('
        int for_C(int n) {
          int a = 0;
          for(int i = 1; i < (n+1); i++) {
            a += i;
          }
          return a;
        }', showOutput = TRUE)

microbenchmark::microbenchmark('R-Schleife' = for_R(10000),
                               'C-Schleife' = for_C(10000))

cppFunction的输出是:

## C:/PROGRA~1/R/R-32~1.1/bin/x64/R CMD SHLIB -o "sourceCpp_71184.dll" "" "file30c7c6b798b.cpp"

我对以下错误感到有点困惑,只有当我编织文件时才出现:

## Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, : Error 1 occurred building shared library.

如果我在控制台中运行代码,一切正常,没有任何错误。我也尝试从不同的方向编织Rmd文件,但也失败了。

有关该软件的一些信息:

  • R版本是2.3.1
  • 在C:
  • 中安装的Rtools
  • 我将所有内容与Rstudio版本0.99.465
  • 结合使用

我在其他帖子中搜索过,但每当我发现有关此错误的内容时,它都不在rmarkdown中。我安装了一个新的操作系统(Windows 8.1),在完成并安装所有程序后发生错误。如果有人可以提供帮助,我会很高兴。

2 个答案:

答案 0 :(得分:1)

您的代码为我构建(在Linux下)。但我会使用sourceCpp()并将所有内容放在.cpp文件中:

#include <Rcpp.h>

// [[Rcpp::export]]
int for_C(int n) {
  int a = 0;
  for(int i = 1; i < (n+1); i++) {
    a += i;
  }
  return a;
}

/*** R
for_R <- function(n) {
  a <- 0
  for(i in 1:n){
    a = a + i
  }
  return(a)
}

microbenchmark::microbenchmark('R-Schleife' = for_R(10000),
                               'C-Schleife' = for_C(10000))
*/

,当sourceCpp() - ed时,产生结果:

R> sourceCpp("/tmp/daniel.cpp")

R> for_R <- function(n) {
+   a <- 0
+   for(i in 1:n){
+     a = a + i
+   }
+   return(a)
+ }

R> microbenchmark::microbenchmark('R-Schleife' = for_R(10000),
+                                'C-Schleife' = for_C(10000))
Unit: microseconds
       expr      min       lq       mean   median       uq       max neval
 R-Schleife 4351.736 4680.954 6300.95103 4774.863 5166.111 70614.405   100
 C-Schleife    5.457    6.618    9.80134    9.746   11.471    50.236   100
R> 

答案 1 :(得分:0)

我今天回顾了我的问题,现在我得到了答案。我认识到我的道路不正确。在解决了这个愚蠢的错误后,一切正常。再次感谢Dirk。