R 内联错误

R 内联错误,r,inline,rcpp,R,Inline,Rcpp,第33行是或(i=0;i

第33行是
或(i=0;i
。我已经阅读了
CXX函数的帮助,并试图将第33行更改为

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'
(i=0;i{
甚至:

for (i=0;i < as<int>(N) ;i++){
for(i=0;i
但是,我还是会出错

这个错误是从哪里来的?它意味着什么


备注:此问题与此相关

您正在错误地使用内联软件包及其CXX功能。它将知道如何使
N
成为
int

通过阅读软件包附带的vignette来使用Rcpp属性,并转换为使用属性。它更简洁、更简单。它还提供了您需要的转换器,但在使用旧接口时无法获得

编辑:

下面是一个完整的文件,您只需通过
sourceCpp(“nameoffile.cpp”)
拉入即可,它将编译、链接、加载和运行代码(包括R部分)。我更改了它,并直接返回somme

for (i=0;i < INTEGER(N) ;i++){
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
双foo(数值向量a,数值向量b){
int N=a.size();
双胞体=0.0;
对于(int i=0;ib[i])
somme+=a[i]-b[i];
其他的
somme+=b[i]-a[i];
}
返回体;
}
/***R
种子(42)
一组种子(42)
R> a b foo(a,b)
[1] 1123.49
R>

是的,我知道这种编写函数的方法。但有人建议我使用
内联
包来提高速度。我想尝试使用它。当然你可以自由使用它——但如果你研究(大量)示例以了解你做错了什么。但它不会比属性更快。
for (i=0;i < INTEGER(N) ;i++){
#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>