标签: rcpp

Rcpp通过引用传递而不是通过值传递

我第一次尝试了Rcpp功能inline,它解决了我的速度问题(感谢Dirk!): R:将负值替换为零

初始版本看起来像这样:

library(inline)
cpp_if_src <- '
  Rcpp::NumericVector xa(a);
  int n_xa = xa.size();
  for(int i=0; i < n_xa; i++) {
    if(xa[i]<0) xa[i] = 0;
  }
  return xa;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)

但是当被调用时cpp_if(p),它会p用输出覆盖,这不是预期的.所以我认为它是通过引用传递的.

所以我用以下版本修复它:

library(inline)
cpp_if_src <- '
  Rcpp::NumericVector xa(a);
  int n_xa = xa.size();
  Rcpp::NumericVector xr(a);
  for(int i=0; i < n_xa; i++) {
    if(xr[i]<0) xr[i] = 0;
  }
  return xr;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
Run Code Online (Sandbox Code Playgroud)

这似乎有效.但是现在,当我将其重新加载到R中时,原始版本不再覆盖其输入(即,相同的确切代码现在不会覆盖其输入):

> cpp_if_src <- '
+   Rcpp::NumericVector …
Run Code Online (Sandbox Code Playgroud)

r rcpp

15
推荐指数
1
解决办法
4404
查看次数

使用Xcode 5.0和Rcpp时出错(安装了命令行工具)

我有一个新的iMac,我正在尝试使用Rcpp库运行代码,该库一直在我的旧iMac和Macbook Pro上运行而没有问题.我已经尝试了一些我似乎无法弄清问题是什么.

Xcode 5.0已下载.然后安装命令行工具.已安装R3.0.2.我下载了一个gcc编译器.当我在终端输入gcc时 - 我得到"clang:" - 这很好,我想.

我得到的错误复制如下.提前感谢任何想法和建议.

Error (in R console):
llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG  -I/usr/local/include  -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include"    -fPIC  -mtune=core2 -g -O2  -c SBM-Ccode.cpp -o SBM-Ccode.o 
Error in sourceCpp("SBM-Ccode.cpp") : 
  Error 1 occurred building shared library.

WARNING: The tools required to build C++ code for R were not found.

Please install Command Line Tools for XCode (or equivalent).

/bin/sh: llvm-g++-4.2: command not found
make: *** [SBM-Ccode.o] Error 127
Run Code Online (Sandbox Code Playgroud)

macos xcode r rcpp

15
推荐指数
3
解决办法
9713
查看次数

使用Rcpp中其他包的C函数

我正在尝试从c ++函数中的cubature包调用C例程来执行多维集成.

我试图重现的基本R例子是

library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
Run Code Online (Sandbox Code Playgroud)

我可以从图库中按照这个配方从Rcpp调用这个R函数,但是从c/c ++到R来回切换会有一些性能损失.从C++直接调用C函数似乎更合理.

C例程adapt_integrate从出口cubature

 // R_RegisterCCallable("cubature", "adapt_integrate", (DL_FUNC) adapt_integrate);
Run Code Online (Sandbox Code Playgroud)

但是,我不明白如何从c ++中调用它.这是我的蹩脚尝试,

sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double integrand(double x){
 return(sin(x));
}

// [[Rcpp::depends(cubature)]]
// [[Rcpp::export]]
Rcpp::List integratecpp(double llim, double ulim)
{
  Rcpp::Function p_cubature = R_GetCCallable("cubature", "adapt_integrate");

  Rcpp::List result = p_cubature(integrand, llim, ulim);
  return(result);
}
'
)

integratecpp(0, pi)
Run Code Online (Sandbox Code Playgroud)

这无法编译; 显然,我正在做一些非常愚蠢的事情,并且缺少一些重要的步骤来将输出R_GetCCallable转换为Rcpp::Function(或直接调用它?).我已经阅读了几篇涉及函数指针的相关文章,但还没有看到使用外部C函数的示例.

c c++ r rcpp

15
推荐指数
2
解决办法
2077
查看次数

R中%%运算符的C++版本

C中的任何函数是否等同%in%于R中的运算符?考虑R中的以下命令:

which(y %in% x)
Run Code Online (Sandbox Code Playgroud)

我试图在C++中找到相同的东西(特别是在Armadillo中),我找不到任何东西.然后我编写了自己的函数,与上面的R命令相比,这个函数非常慢.

这是我写的:

#include <RcppArmadillo.h>
// [[Rcpp::depends("RcppArmadillo")]]

// [[Rcpp::export]]
arma::uvec myInOperator(arma::vec myBigVec, arma::vec mySmallVec ){
 arma::uvec rslt = find(myBigVec == mySmallVec[0]);
 for (int i = 1; i < mySmallVec.size(); i++){
   arma::uvec rslt_tmp = find(myBigVec == mySmallVec[i]);
   rslt = arma::unique(join_cols( rslt, rslt_tmp ));
 }
 return rslt;
}
Run Code Online (Sandbox Code Playgroud)

现在,在上面的代码中采购后,我们有:

x <- 1:4
y <- 1:10
res <- benchmark(myInOperator(y, x), which(y %in% x), columns = c("test",
      "replications", "elapsed", "relative", "user.self", "sys.self"), 
       order = "relative")
Run Code Online (Sandbox Code Playgroud)

以下是结果:

                 test replications elapsed …
Run Code Online (Sandbox Code Playgroud)

c++ r armadillo rcpp

15
推荐指数
2
解决办法
1012
查看次数

R的sum()和Armadillo的accu()之间的差异

当给出相同的输入时,R sum()函数和RcppArmadillo accu()函数的结果存在细微差别.例如,以下代码:

R:

vec <- runif(100, 0, 0.00001)
accu(vec)
sum(vec)
Run Code Online (Sandbox Code Playgroud)

C++:

// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
double accu(arma::vec& obj)
{
    return arma::accu(obj);
}
Run Code Online (Sandbox Code Playgroud)

给出结果:

0.00047941851844312633(C++)

0.00047941851844312628(R)

根据http://keisan.casio.com/calculator的说法,真正的答案是:

4.79418518443126270948E -4-

这些小的差异在我的算法中加起来并且显着影响它的执行方式.有没有办法在C++中更准确地总结向量?或者至少在不必调用R代码的情况下获得与R相同的结果?

c++ precision r armadillo rcpp

15
推荐指数
2
解决办法
1427
查看次数

如何测试Rcpp :: CharacterVector元素是否相等?

我正在尝试编写一些简单的Rcpp代码示例.使用Rcppinline包装非常容易.

但我很难过如何测试两个字符元素是否相等.以下示例比较了两个字符向量的第一个元素.但我无法编译.

诀窍是什么?

library(Rcpp)
library(inline)

cCode <- '
    Rcpp::CharacterVector cx(x);
    Rcpp::CharacterVector cy(y);
    Rcpp::LogicalVector r(1);
    r[0] = (cx[0] == cy[0]);
    return(r);
    '

cCharCompare <- cxxfunction(signature(x="character", y="character"), 
                            plugin="Rcpp", body=cCode)
cCharCompare("a", "b")
Run Code Online (Sandbox Code Playgroud)

-

==如果两个元素中的一个是常数,则使用的比较完全正常.以下代码编译并给出预期结果:

cCode <- '
    Rcpp::CharacterVector cx(x);
    Rcpp::LogicalVector r(1);
    r[0] = (cx[0] == "a");
    return(r);
    '

cCharCompareA <- cxxfunction(signature(x="character"), plugin="Rcpp", body=cCode)

cCharCompareA("a")
[1] TRUE

cCharCompareA("b")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

r rcpp

14
推荐指数
3
解决办法
4237
查看次数

R中数据的快速边界

假设我有一个向量,vec它很长(从1E8条目开始),并希望将其绑定到范围[a,b].我肯定能代码vec[vec < a] = avec[vec > b] = b,但是这需要两个越过数据和用于临时指标向量大RAM分配(〜800MB,两次).这两个过程的刻录时间是因为如果我们只将数据从主内存复制到本地缓存一次就会做得更好(对主内存的调用很糟糕,缓存未命中也是如此).谁知道多线程可以提高多少,但让我们不要贪心.:)

在基础R或某些我正在忽略的软件包中是否有一个很好的实现,或者这是Rcpp(或我的老朋友data.table)的工作?

performance r bigdata rcpp data.table

14
推荐指数
2
解决办法
390
查看次数

从Rcpp中的包装方法返回自定义对象

我对Rcpp模块有以下问题:让我们假设我在Rcpp模块中有两个类

class A {
  public:
    int x;
};

class B
  public:
    A get_an_a(){
      A an_a();
      an_a.x=3;
      return an_a;
    }
};

RCPP_MODULE(mod){
  using namespace Rcpp ;
  class_<A>("A")
   .constructor()
   .property("x",&A::get_x)
  ;
  class_<B>("B)
   .constructor()
   .method("get_an_A",&get_an_a)
  ;
}
Run Code Online (Sandbox Code Playgroud)

.

现在编译失败了,因为它不知道如何处理A的返回类型.

我想我可以用Rcpp :: Xptr做一些事情然而,然后我无法将它连接到Rcpp为类A生成的S4结构.我实际上从R中的方法获得了一个外部指针对象.

是否有可能从第二类的方法中获取正确包装的对象?

谢谢,托马斯

[编辑]

根据Dirk的回答,我构造了一个可以创建包装的S4对象的包装器:

template <> SEXP wrap(const A &obj) { // insprired from "make_new_object" from Rcpp/Module.h
  Rcpp::XPtr<A> xp( new A(obj), true ) ; // copy and mark as finalizable
  Function maker=Environment::Rcpp_namespace()[ "cpp_object_maker"];
  return maker ( typeid(A).name() , xp );
} …
Run Code Online (Sandbox Code Playgroud)

c++ module r rcpp

14
推荐指数
2
解决办法
2288
查看次数

将未评估的表达式传递给C/C++

我想将一个函数的可变数量的参数传递给C/C++,但是希望保留参数不被评估,同时不希望在R中进行任何计算(除了调用C/C++之外)功能),即我不想调用substitute我的R函数.我认为我可以使用的一个选项就是.External像这样做smth:

R_fn = function(...) .External("cpp_fn", ...)

...
# and in C code:
SEXP cpp_fn (SEXP arglist) {
}
Run Code Online (Sandbox Code Playgroud)

然而,.External正在评估参数...,所以如果我尝试类似的东西

rm(x, y) # just making sure these don't exist

R_fn(x*y)
Run Code Online (Sandbox Code Playgroud)

我收到错误,因为R x*y 将其发送到函数之前尝试进行评估.

相比之下,R中的以下作品:

f = function(...) g(...)
g = function(x, ...) print(substitute(x))

f(x*y*z)
# x * y * z
Run Code Online (Sandbox Code Playgroud)

我还有其他选择吗?显然,它可以做,因为R本身为许多功能做了它,例如substitute它本身,但我不明白该怎么做.我添加了rcpp标签,因为我最终会使用这个标签Rcpp.

c r rcpp

14
推荐指数
1
解决办法
391
查看次数

rcpp函数调用另一个rcpp函数

我猜这是一个简单的问题,但我是Cpp的新手,我被卡住了.

我在R中创建了一个函数,使用Rcpp和:

// [[Rcpp::export]]
Run Code Online (Sandbox Code Playgroud)

我可以在R中调用该函数,它可以按预期工作.我们称之为F1.

接下来,我想创建另一个函数F2,使用Rcpp它调用第一个函数.我使用标准函数调用语言(即,F1(arguments))当我使用时它通过R编译很好sourceCpp().

但是当我试着打电话给F2R时,我得到:

.Primitive中出错(".Call")(

缺少F2

第一个.cpp文件包含

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F1(NumericVector a) {
  int n = a.size();
  double result=0;  // create output vector
  double ss = 0;

  for(int i = 0; i < n; ++i) {
    ss += pow(a[i],2);
  }

  result = ss;
  return result;
}
Run Code Online (Sandbox Code Playgroud)

以下是另一个.cpp文件.

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) …
Run Code Online (Sandbox Code Playgroud)

r rcpp

14
推荐指数
2
解决办法
4258
查看次数

标签 统计

r ×10

rcpp ×10

c++ ×4

armadillo ×2

c ×2

bigdata ×1

data.table ×1

macos ×1

module ×1

performance ×1

precision ×1

xcode ×1