我试图在R包中使用OpenCV中的一些代码,使用Rcpp构建包.当我在我的机器上编译c代码时,它工作正常.
例如,我在本地使用以下语法来编译facedetect.cpp代码:
g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用以下命令将其包含在我的包中时:
R CMD SHLIB facedetect.cpp -o facedetect
Run Code Online (Sandbox Code Playgroud)
在我的makevars文件中定义了以下内容:
PKG_CPPFLAGS= `$(R_HOME)/bin/Rscript -e 'Rcpp:::CxxFlags()'`
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"`
PKG_CXXFLAGS= `pkg-config --cflags opencv` `pkg-config --libs opencv`
Run Code Online (Sandbox Code Playgroud)
R执行以下操作:
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 `pkg-config --cflags opencv` `pkg-config --libs opencv` `/Library/Frameworks/R.framework/Resources/bin/Rscript -e 'Rcpp:::CxxFlags()'` -I/usr/local/include -fPIC -g -O2 -c facedetect.cpp -o facedetect.o
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误消息:
i686-apple-darwin10-g++-4.2.1: -lopencv_core: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_imgproc: linker input file unused because linking not done …Run Code Online (Sandbox Code Playgroud) 我希望这不是太明显,因为我整天搜索并找不到答案.
说我有以下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(),我该怎么办?
看看rcpp文档和Rcpp::DataFrame库中我意识到我不知道如何通过引用修改DataFrame.谷歌搜索了一下我在SO上找到了这篇文章,这篇文章在档案上.没有什么明显的,所以我怀疑我会错过一些像"已经是这种情况因为"或"因为它没有意义"的大事.
我尝试了以下编译,但data.frame传递给updateDFByRefR 的对象 保持不变
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void updateDFByRef(DataFrame& df) {
int N = df.nrows();
NumericVector newCol(N,1.);
df["newCol"] = newCol;
return;
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读"使用Rcpp进行无缝R和C++集成"的第4章,我遇到了一些问题.
在"列表4.13"中,本书给出了一个关于如何使用R函数的例子.我尝试使用其他函数(不同的例子)并且我获得了成功.我的代码在这里:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom(Rcpp::NumericVector x) {
int n = x.size();
Rcpp::NumericVector y1(n), y2(n), y3(n);
y1 = Rcpp::pexp(x,1.0,1,0);
y2 = Rcpp::pnorm(x,0.0,1.0,1,0);
y3 = Rcpp::ppois(x,3.0,1,0);
return Rcpp::DataFrame::create(Rcpp::Named("Exp") = y1,Rcpp::Named("Norm") = y2, Rcpp::Named("Pois") = y3);
}
sourceCpp("random.cpp")
myrandom(c(0.5,1))
Run Code Online (Sandbox Code Playgroud)
在这种情况下还可以,但是当我尝试使用Rcpp :: pt时,我没有成功.我的代码在这里.
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom2(Rcpp::NumericVector x) {
int n = x.size();
Rcpp::NumericVector y1(n);
y1 = Rcpp::pt(x,3.0,0,1,0);
return Rcpp::DataFrame::create(Rcpp::Named("T") = y1);
}
sourceCpp("random2.cpp")
myrandom2(c(0.5,1))
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h: In function ‘Rcpp::stats::P2<RTYPE, NA, T> Rcpp::pt(const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, …Run Code Online (Sandbox Code Playgroud) 我刚开始使用Rcpp并想知道是否存在Rcpp糖功能列表.在翻译我的一些缓慢代码到C/C的过程++我需要通过基础R的功能,如提供的功能match,tabulate和which.
根据Hadley的高级R书 match的实施,Rcpp-sugar插图列出了一些可用的功能,虽然它看起来并不全面.
我真正想知道的是:有没有办法在包装文件或其他地方找到什么甜蜜甜蜜的功能以及我必须为自己写的东西?对于任何其他R包我直接去,R> help(package = "Rcpp")但在这种情况下似乎没有多大帮助.
我正在研究一个使用CUDA和Rcpp 的微型R包,它是根据输出改编的Rcpp.package.skeleton().我将首先描述主分支上标题为"fixed namespace"的提交.如果我忘记了CUDA,那么包安装成功(即,如果我删除src/Makefile,将src/rcppcuda.cu更改为src/rcppcuda.cpp,并注释掉定义和调用内核的代码).但是原样,编译失败了.
我也想知道如何使用Makevars或Makevars.in而不是Makefile进行编译,并且通常尝试将其作为平台独立实现.我在R扩展手册中读过关于Makevars的内容,但我仍然无法使其工作.
你们中的一些人可能会建议rCUDA,但我真正想要的是改进我已经开发了一段时间的大包装,而且我不确定切换是否值得从头开始.
无论如何,这是当我做一个R CMD build和R CMD INSTALL在这一个(主分支,提交标题为"固定名称空间")时发生的事情.
* installing to library ‘/home/landau/.R/library’
* installing *source* package ‘rcppcuda’ ...
** libs
** arch -
/usr/local/cuda/bin/nvcc -c rcppcuda.cu -o rcppcuda.o --shared -Xcompiler "-fPIC" -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -I/apps/R-3.2.0/include -I/usr/local/cuda/include
rcppcuda.cu:1:18: error: Rcpp.h: No such file or directory
make: *** [rcppcuda.o] Error 1
ERROR: compilation failed for package ‘rcppcuda’
* removing ‘/home/landau/.R/library/rcppcuda’
Run Code Online (Sandbox Code Playgroud)
...这很奇怪,因为我确实包含了Rcpp.h,并且安装了Rcpp.
$ …Run Code Online (Sandbox Code Playgroud) 我对Rcpp有一些奇怪的麻烦 - 它使用了不可预测的C++编译器.这个问题有点类似于这个问题.
我在OSX上,我有2个编译器 - 默认clang和openmp clang-omp支持.我也有以下~/.R/Makevars文件(我设置clang-omp为默认编译器):
CC = clang-omp
CXX = clang-omp ++
CFLAGS + = -O3 -Wall -pipe -pedantic -std = gnu99
CXXFLAGS + = -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp
问题是,我正在开发的软件包编译而clang++不是clang-omp++.我也尝试过(作为实验来解决问题)更改包src/Makevars和设置CXX=clang-omp++以及修改后的$R_HOME/etc/Makeconf CXX条目CXX = clang-omp++.没有运气 - 它仍然可以编译clang++.不知道为什么会这样.
这里也是小的可重现的(来自控制台R和来自Rstudio)的例子(不知道它是否与上面的问题有关).假设2个非常相似的cpp函数:
1.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
} …Run Code Online (Sandbox Code Playgroud) 我有一个大的,宽的data.table(20米行)由一个人ID键入,但有很多列(~150)有很多空值.每列都是我希望为每个人继承的记录状态/属性.每个人可能有10到10,000个观察点,并且该集合中有大约500,000人.来自一个人的值不能"流血"到下一个人,因此我的解决方案必须适当地尊重人员ID列和组.
出于演示目的 - 这是一个非常小的示例输入:
DT = data.table(
id=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
aa=c("A", NA, "B", "C", NA, NA, "D", "E", "F", NA, NA, NA),
bb=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
cc=c(1, NA, NA, NA, NA, 4, NA, 5, 6, NA, 7, NA)
)
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
id aa bb cc
1: 1 A NA 1
2: 1 NA NA NA
3: 1 B NA NA
4: 1 …Run Code Online (Sandbox Code Playgroud) 首先,我是一个新手用户,所以忘记我一般的无知.我正在寻找更快的替代R中的%*%运算符.虽然较旧的帖子建议使用RcppArmadillo,但我已经尝试了2个小时让RcppArmadillo工作没有成功.我总是遇到会产生'意外......'错误的词汇问题.我在Rcpp中找到了以下功能,我可以做的工作:
library(Rcpp)
func <- '
NumericMatrix mmult( NumericMatrix m , NumericMatrix v, bool byrow=true )
{
if( ! m.nrow() == v.nrow() ) stop("Non-conformable arrays") ;
if( ! m.ncol() == v.ncol() ) stop("Non-conformable arrays") ;
NumericMatrix out(m) ;
for (int i = 0; i < m.nrow(); i++)
{
for (int j = 0; j < m.ncol(); j++)
{
out(i,j)=m(i,j) * v(i,j) ;
}
}
return out ;
}
'
Run Code Online (Sandbox Code Playgroud)
但是,此函数执行逐元素乘法,并且不表现为%*%.有没有一种简单的方法来修改上面的代码来实现预期的结果?
编辑:
我已经提出了一个使用RcppEigen的函数,似乎超过%*%:
etest <- cxxfunction(signature(tm="NumericMatrix",
tm2="NumericMatrix"),
plugin="RcppEigen",
body="
NumericMatrix tm22(tm2);
NumericMatrix …Run Code Online (Sandbox Code Playgroud) 是否有任何理由为什么我应该更喜欢Rcpp::NumericVector过std::vector<double>?
例如,下面的两个功能
// [[Rcpp::export]]
Rcpp::NumericVector foo(const Rcpp::NumericVector& x) {
Rcpp::NumericVector tmp(x.length());
for (int i = 0; i < x.length(); i++)
tmp[i] = x[i] + 1.0;
return tmp;
}
// [[Rcpp::export]]
std::vector<double> bar(const std::vector<double>& x) {
std::vector<double> tmp(x.size());
for (int i = 0; i < x.size(); i++)
tmp[i] = x[i] + 1.0;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
在考虑其工作和基准性能时是等效的.我知道Rcpp提供了糖和矢量化操作,但是如果只是将R的向量作为输入并将向量作为输出返回,那么我使用哪一个会有什么区别吗?std::vector<double>在与R交互时可以使用导致任何可能的问题吗?