我有一个名为的头文件coolStuff.h包含一个awesomeSauce(arg1)我想在我的cpp源文件中使用的函数.
目录结构:
代码:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经移动了整个地方的文件和目录,似乎无法让它工作.我看到使用第三方标题的示例,只是说这样做:
#include <boost/array.hpp>
Run Code Online (Sandbox Code Playgroud)
(来自Hadley/devtools)
https://github.com/hadley/devtools/wiki/Rcpp
什么给出了什么?我整个上午一直在寻找,但找不到像我这样简单事情的答案.
好了,我已经想出如何在Rstudio中构建使用Rcpp的软件包,让我重新解释一下这个问题.我有一个独立的头文件coolStuff.h,它包含我想在我的cpp代码中使用的函数.
1)我应该在包目录结构中放置coolStuff.h,以便它包含的函数可以被CppFile.cpp使用?
2)如何在cpp文件中调用coolStuff.h?再次感谢你的帮助.我从上次谈话中学到了很多东西.
注意:我阅读了小插图"编写使用Rcpp的软件包",但没有解释如何执行此操作.
好吧,让我总结一下我的问题的答案,因为它分散在这个页面上.如果我得到一个错误的细节,请随时编辑或让我知道,我将编辑它:
因此,您找到了一个.h或多个.cpp文件,其中包含您要在.cpp要编写的文件中使用的函数或其他一些代码Rcpp.
让我们继续调用这个找到的代码coolStuff.h并调用你想要使用的函数awesomeSauce().让我们调用您正在编写的文件theCppFile.cpp.
(我应该注意这里.h文件和.cpp文件中的代码都是C++代码,它们之间的区别在于C++程序员以正确的方式保持组织.我将在这里讨论差异,但在SO上进行简单的搜索会引导你讨论差异.对于你需要使用你发现的代码的R程序员,没有真正的区别.)
简而言之:您可以使用一个文件,coolStuff.h如果它不调用其他库,通过剪切和粘贴theCppFile.cpp,或者如果您创建一个包,您可以将文件放在\src包含该theCppFile.cpp文件的目录中并在文件 …
有人可以举例说明如何正确使用模板标签Roxygen2.我试图做最明显的事情(对我来说):
在我的packageName-package.R档案中:
#' [... other Roxygen blocks ...]
#'
#' @templateVar testTemplateTag Testing one two
NULL
Run Code Online (Sandbox Code Playgroud)
然后在someFunction.R文件中
#' [... other Roxygen blocks ...]
#'
#' @template testTemplateTag
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error : Can not find template testTemplateTag
Run Code Online (Sandbox Code Playgroud)
我试图有一个地方来记录通常重复的定义示例等.当这些东西嵌套在我一直在使用的一组函数中时@inheritParms.但有些东西,如定义和其他描述,在几个地方使用.我已经搜查高和低的使用@template和@templateVar并没有发现任何东西.
谢谢.
我目前有一个.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的软件包" …
如何将boost :: geometry多边形转换为STL对象?
我确信这一定很简单,因为我无法在文档中找到任何示例.然而,我花了大约4个工作日试图做这件小事.我是C++的新手(长时间的R程序员),但这些小数据转换事件让我疯狂.
是的,有一个问题的标题与我的很相似:从Boost Geometry多边形获取点的坐标
但代码是如此复杂(海报不断改变它),我无法做出正面或反面,我也无法想象其他C++新手能够做到的.
这是一个简单的例子,应该转换为其他一些boost :: geometry数据类型,所以希望任何人都可以遵循它.
#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/adapted/boost_tuple.hpp>
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
//One thing I tried is a function to use with `for_each_point()` so I set that up first.
template <typename Point>
void get_coordinates(Point const& p)
{
using boost::geometry::get;
std::cout << get<0>(p) get<1>(p) << std::endl;
}
int main()
{
typedef boost::tuple<double, double> point;
typedef boost::geometry::model::polygon<point> polygon;
polygon poly;
boost::geometry::read_wkt("polygon((2.0 1.3, 2.4 1.7, 2.8 1.8, 3.4 1.2, 3.7 1.6, 3.4 2.0, 4.1 3.0, …Run Code Online (Sandbox Code Playgroud) 可能重复:
将第三方头文件与Rcpp一起使用
注意:这是从此处开始的讨论的继续: 将第三方头文件与Rcpp一起使用。但是,这个问题足够不同,以至于我认为我会将它摆成自己的问题。
我有一个名为的头文件coolStuff.h,其中包含一个awesomeSauce(arg1)我想在R包中的cpp文件中调用的函数。
包装结构:
包裹名字
[男人]
名称空间
TheCppFile.cpp的代码:
`#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;`
Run Code Online (Sandbox Code Playgroud)
1)我应该coolStuff.h在包目录结构中放置什么位置,以便在生成包并编译cpp文件时,将包括coolStuff.h中的代码。
2)我该怎么称呼这个文件coolStuff.h?
3)同样,如果我想otherCppFile.cpp在theCppFile.cpp哪里打电话
再次感谢您的帮助。我从上一次谈话中学到了很多东西。如果某处有一些标准文档,我会对RTFM感到满意,只需指出正确的方向即可。
我发现,我失去了不漂亮<as>和<wrap>命令,RCPP及其相关软件包提供了对不同对象类型之间的转换.
我有一个点矩阵,行代表二维笛卡尔空间中的点:
pointsMatrix <- matrix(runif(100,-1,1),50,50)
Run Code Online (Sandbox Code Playgroud)
然后我想使用boost几何中的convex_hull算法来找到点的凸包.
但是,我不确定如何将其转换NumericMatrix为convex_hull理解的数据类型之一.此外,我不确定如何将Boost Geometry的输出转换回Rcpp可以交回R的内容.
#include <Rcpp.h>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
using namespace Rcpp;
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
// [[Rcpp::export]]
NumericMatrix convexHullRcpp(NumericMatrix pointsMatrix){
typedef boost::tuple<double, double> point;
typedef boost::geometry::model::polygon<point> polygon;
// Some sort of conversion of pointsMatrix here to pointsMatrixBG//
polygon hull;
boost::geometry::convex_hull(pointsMatrixBG, hull);
//Now to convert hull into something that Rcpp can hand back to R.//
return hullToR;
}
Run Code Online (Sandbox Code Playgroud)
看起来boost.tuple可能是最好的选择