我对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/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.
我想了解如何java.awt.Dialog实现模态(阻止其他窗口)?
是的,我试过阅读代码java.awt.Dialog,但我有点迷失它.所以我想简要地知道他们做了什么.他们是否禁用所有其他窗口的所有事件?
谢谢Prem
我目前有一个.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的软件包" …
我希望这不是太明显,因为我整天搜索并找不到答案.
说我有以下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(),我该怎么办?
我正在考虑使用一些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) 我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转换NumericVector为double[]?
我一直在努力通过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代码来运行它.感谢您对此的任何帮助,或直接告诉我为什么我的建议不可行或不推荐.
我期待看到德克的新书.
为什么以下代码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) 我正在研究一个需要逐元素矩阵乘法的代码.我试图在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)
我可能会遗漏一些非常微不足道的东西,并想问是否有任何方法可以做到这一点(除了使用循环迭代每个元素并乘以).
提前致谢.