内联错误

时间:2014-07-16 13:52:48

标签: r inline rcpp

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

有关

1 个答案:

答案 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>