require(inline)
require(Rcpp)
sig <- signature(a="NumericVector", b="NumericVector", N="int")
body <- 'int i=0;
double somme=0.0;
for (i=0;i < N ;i++){
if (a[i] > b[i])
somme += a[i] - b[i];
else
somme += b[i] - a[i];
}
return(exp( - somme));'
f <- cxxfunction(sig, body, plugin="Rcpp", includes = c('#include <math.h>'))
我使用了以下代码。但它让我产生了一个我不明白的错误:
file11346d634c82.cpp: In function 'SEXPREC* file11346d634c82(SEXP, SEXP, SEXP)':
file11346d634c82.cpp:32:16: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
file11346d634c82.cpp:33:12: error: invalid use of incomplete type 'struct SEXPREC'
C:/Users/sn235843/DOCUME~1/R/R-31~1.0/include/Rinternals.h:424:16: error: forward declaration of 'struct SEXPREC'
file11346d634c82.cpp:33:19: error: invalid use of incomplete type 'struct SEXPREC'
第33行是or (i=0;i < N ;i++){
。我已阅读cxxfunction
帮助,并尝试将此第33行更改为
for (i=0;i < as<int>(N) ;i++){
甚至:
for (i=0;i < INTEGER(N) ;i++){
但是,我仍然会收到错误......
此错误来自哪里?这是什么意思?
备注:此问题与此one
有关答案 0 :(得分:2)
您正在使用内联包及其cxx函数错误。 不知道如何N
成为int
。
通过读取包附带的晕影来使用Rcpp属性,并转换为使用属性。它更简洁,更简单。它还提供了您想要的转换器,但是在使用旧接口时无法获得。
编辑:
下面是一个完整的文件,你可以通过sourceCpp("nameOfTheFile.cpp")
简单地输入它,它将编译,链接,加载和运行代码(包括R部分)。我改变了它直接返回somme。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double foo(NumericVector a, NumericVector b) {
int N = a.size();
double somme=0.0;
for (int i=0;i < N; i++){
if (a[i] > b[i])
somme += a[i] - b[i];
else
somme += b[i] - a[i];
}
return somme;
}
/*** R
set.seed(42)
a <- rnorm(1000)
b <- rnorm(1000)
foo(a,b)
*/
演示:
R> sourceCpp("foo.cpp")
R> set.seed(42)
R> a <- rnorm(1000)
R> b <- rnorm(1000)
R> foo(a,b)
[1] 1123.49
R>