小编Rom*_*ois的帖子

从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
查看次数

java.awt.dialog如何实现模态?

我想了解如何java.awt.Dialog实现模态(阻止其他窗口)?

是的,我试过阅读代码java.awt.Dialog,但我有点迷失它.所以我想简要地知道他们做了什么.他们是否禁用所有其他窗口的所有事件?

谢谢Prem

java user-interface modal-dialog awt

13
推荐指数
1
解决办法
270
查看次数

从sourceCpp迁移到包含Rcpp的包

我目前有一个.cpp可以使用的文件sourceCpp().正如所料,创建了相应的R函数,代码按预期工作.

这里是:

#include <Rcpp.h> 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector exampleOne(NumericVector vectorOne, NumericVector vectorTwo){

    NumericVector outputVector = vectorOne + vectorTwo; 

    return outputVector;
}
Run Code Online (Sandbox Code Playgroud)

我现在将我的项目转换为使用的包Rcpp.所以我用rStudio创建了骨架,并开始研究如何将事物转换过来.

在Hadley 关于Cpp优秀入门书中,他在"在一个包中使用Rcpp"一节中说:

如果您的包使用Rcpp :: export属性,则需要在包构建过程中执行一个额外步骤.compileAttributes函数扫描包中的源文件以获取Rcpp :: export属性,并生成将函数导出到R所需的代码.

每当添加,删除函数或更改其签名时,都应重新运行compileAttributes.请注意,如果使用RStudio或devtools构建程序包,则会自动执行此步骤.

所以看起来编译的代码sourceCpp()应该像包中一样工作.

我创建了相应的R文件.

exampleOne <- function(vectorOne, vectorTwo){
    outToR <- .Call("exampleOne", vectorOne, vectorTwo, PACKAGE ="testPackage")
    outToR
}
Run Code Online (Sandbox Code Playgroud)

然后我(重新)构建了包,我得到了这个错误:

Error in .Call("exampleOne", vectorOne, vectorTwo, PACKAGE = "voteR") : C symbol name "exampleOne" not in DLL for package "testPackage"

有没有人知道在使用sourceCpp()编译然后在包中使用它的代码时我还需要做什么?

我应该注意到我已经读过:"编写一个使用Rcpp的软件包" …

c++ r rcpp

13
推荐指数
2
解决办法
6000
查看次数

Rcpp - 在sourceCpp引用的文件中使用多个C++函数?

我希望这不是太明显,因为我整天搜索并找不到答案.

说我有以下R文件:

library(Rcpp)
sourceCpp("cfile.cpp")

giveOutput(c(1,2,3))
Run Code Online (Sandbox Code Playgroud)

它编译以下C++文件:

#include <Rcpp>
using namespace Rcpp;
// [[Rcpp::export]]

NumericVector plusTwo(NumericVector x){
  NumericVector out = x + 2.0;

  return out;
}

NumericVector giveOutput(NumericVector a){

NumericVector b = plusTwo(a);
return b;
}
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,Rcpp预处理器都plusTwo()可用,而giveOutput()不是.我能够找到的文档说这是一个应该创建一个包的点,但是在阅读了包后,它看起来比我需要的要复杂一个数量级.

如果没有明确定义plusTwo()内部giveOutput(),我该怎么办?

r rcpp

11
推荐指数
1
解决办法
2981
查看次数

子集一个矢量并对其进行排序

我正在考虑使用一些C++来使用我的R包的简单部分 Rcpp包中的.我是C++新手(但很想学习!).我已经使用优秀的实现了一些简单的cpp程序Rcpp- 实际上这个程序包激励我学习C++ ...

无论如何,我遇到了一个简单的问题,如果我可以修复它会帮助很多.我有一个NumericVector我想要子集然后排序.下面的代码对整个向量进行排序(并且还将处理NAs,这是我需要的).

我的问题是,我想要提取这个向量的一部分,排序并让它可用于其他处理 - 我该怎么做?例如,对于长度为10的向量,如何提取和排序元素5:10?

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
RcppExport SEXP rollP(SEXP x) {
  NumericVector A(x); // the data  
  A = sort_unique(A);  
  return A;
}
Run Code Online (Sandbox Code Playgroud)

我从R打电话:

sourceCpp( "rollP.cpp")
rollP(10:1)
# [1]  1  2  3  4  5  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

c++ r rcpp

10
推荐指数
1
解决办法
2956
查看次数

从NumericVector填充C++数组的更好的习惯用法

Rcpp用来包装一个用C语言编写的算法(不是我)(没有STL,没有提升,没有任何东西,据我所知).你可以在这里看到实现的算法(我正在包装kmeans_w_03).因此,我numeric从R 传入一个向量,然后需要将其转换为double数组.

目前我正在逐个元素地循环并从"tother"中填充一个,如下所示:

SEXP testfn(SEXP weightvec, SEXP cluster_num_k){
    Rcpp::NumericVector weightR(weightvec) ;
    int point_num = weightR.size();
    double weight[point_num] ;
    for(int i = 0; i < point_num; ++i) {
      weight[i] = weightR[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是使用单元素数字向量,我可以利用Rcpp的漂亮的as转换功能:

int cluster_num = Rcpp::as<int>(cluster_num_k);
Run Code Online (Sandbox Code Playgroud)

但是,为长度> 1的数字向量尝试类似的东西会导致崩溃或错误,具体取决于语法的确切变体:

double weight[point_num] = Rcpp::as<double>(weightvec);
Run Code Online (Sandbox Code Playgroud)

我不一定介意循环,但我是一个完全新手,并怀疑有更好的方法.我已经阅读了Rcpp介绍,hadley的wiki教程和RcppExamples,但还没有找到解决这个问题的任何内容,但这并不意味着我不会错过它.我读到的Doxygen Rcpp文档是as可以转换为STL向量而不是数组(但我很难读取这些文档,所以我怀疑我错了).如果是这样,我想我可以投射到一个向量,然后到一个数组....

所以我的问题是:是否有更好的(更少的代码行,更具表现力的代码,甚至可以避免内存分配)的方式将a转换NumericVectordouble[]

c++ r rcpp

10
推荐指数
1
解决办法
3432
查看次数

使用Rcpp运行已编译的C++代码

我一直在努力通过Dirk Eddelbuettel的Rcpp教程:

http://www.rinfinance.com/agenda/

我已经学会了如何在目录中保存C++文件并调用它并从R中运行它.我运行的C++文件名为'logabs2.ccp',其内容直接来自Dirk的幻灯片之一:

#include <Rcpp.h>

using namespace Rcpp;

inline double f(double x) { return ::log(::fabs(x)); }

// [[Rcpp::export]]
std::vector<double> logabs2(std::vector<double> x) {
    std::transform(x.begin(), x.end(), x.begin(), f);
    return x;
}
Run Code Online (Sandbox Code Playgroud)

我用这个R代码运行它:

library(Rcpp)
sourceCpp("c:/users/mmiller21/simple r programs/logabs2.cpp")
logabs2(seq(-5, 5, by=2))
# [1] 1.609438 1.098612 0.000000 0.000000 1.098612 1.609438
Run Code Online (Sandbox Code Playgroud)

我在R GUI中运行Windows 7计算机上的代码,默认情况下似乎是安装的.我还安装了最新版本的Rtools.上面的R代码似乎需要相对较长的时间才能运行.我怀疑大部分时间都用于编译C++代码,而且一旦编译C++代码,它就会非常快速地运行. Microbenchmark当然表明Rcpp减少了计算时间.

我从来没有使用过C++,但我知道当我编译C代码时,我会得到一个*.exe文件.我从一个名为logabs2.exe但找不到的文件中搜索了我的硬盘.我想知道如果logabs2.exe创建文件,上述C++代码是否可能运行得更快.是否可以创建一个logabs2.exe文件并将其存储在某个文件夹中,然后每当我想使用它时让Rcpp调用该文件?我不知道这是否合理.如果我可以在*.exe文件中存储C++函数,那么每次我想要将它与Rcpp一起使用时我可能不需要编译该函数,那么Rcpp代码可能会更快.

对不起,如果这个问题没有意义或是重复的话.如果可以将C++函数存储为*.exe文件,我希望有人会告诉我如何修改上面的R代码来运行它.感谢您对此的任何帮助,或直接告诉我为什么我的建议不可行或不推荐.

我期待看到德克的新书.

c++ r rcpp

9
推荐指数
2
解决办法
6513
查看次数

预处理器如何在C中工作?

为什么以下代码16的答案是什么?谁能解释一下这个程序的工作原理?

#define SQUARE(n) n*n
void main()
{
    int j;      
    j =16/SQUARE(2);

    printf("\n j=%d",j);
    getch();
}
Run Code Online (Sandbox Code Playgroud)

如果我们写下面的相同代码,那么答案是4:

//the ans is 4 why?
#include<stdio.h>
#include<conio.h>

#define SQUARE(n) n*n

void main()
{
    int j;      
    j =16/(SQUARE(2));

    printf("\n j=%d",j);
    getch();
}
Run Code Online (Sandbox Code Playgroud)

c

7
推荐指数
2
解决办法
1777
查看次数

Rcpp中的元素智能矩阵乘法

我正在研究一个需要逐元素矩阵乘法的代码.我试图在Rcpp中实现这个,因为代码需要一些昂贵的循环.我对Rcpp相当新,可能会遗漏一些东西,但我不能让元素明确的矩阵乘法起作用.

// [[Rcpp::export]]

NumericMatrix multMat(NumericMatrix m1, NumericMatrix m2) {
    NumericMatrix multMatrix = m1 * m2 // How can this be implemented ?
}
Run Code Online (Sandbox Code Playgroud)

我可能会遗漏一些非常微不足道的东西,并想问是否有任何方法可以做到这一点(除了使用循环迭代每个元素并乘以).

提前致谢.

rcpp

7
推荐指数
1
解决办法
3626
查看次数

标签 统计

rcpp ×8

r ×7

c++ ×5

c ×2

awt ×1

java ×1

modal-dialog ×1

module ×1

user-interface ×1