我想将普通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文件,但也失败了。
有关该软件的一些信息:
我在其他帖子中搜索过,但每当我发现有关此错误的内容时,它都不在rmarkdown中。我安装了一个新的操作系统(Windows 8.1),在完成并安装所有程序后发生错误。如果有人可以提供帮助,我会很高兴。
答案 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。