小编pol*_*ist的帖子

使用带有Rcpp的第三方头文件

我有一个名为的头文件coolStuff.h包含一个awesomeSauce(arg1)我想在我的cpp源文件中使用的函数.

目录结构:

  • RworkingDirectory
    • sourceCpp
      • theCppFile.cpp
    • cppHeaders
      • coolStuff.h

代码:

#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

什么给出了什么?我整个上午一直在寻找,但找不到像我这样简单事情的答案.

更新01.11.12

好了,我已经想出如何在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文件的目录中并在文件 …

c++ r rcpp

39
推荐指数
2
解决办法
9279
查看次数

使用Roxygen2模板标签

有人可以举例说明如何正确使用模板标签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并没有发现任何东西.

谢谢.

r roxygen roxygen2

22
推荐指数
1
解决办法
2277
查看次数

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

将boost :: geometry多边形转换为STL对象

如何将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)

c++ boost boost-geometry

8
推荐指数
1
解决办法
2942
查看次数

在带有Rcpp的R包中将头文件(.h)与cpp文件一起使用

可能重复:
将第三方头文件与Rcpp一起使用

注意:这是从此处开始的讨论的继续: 将第三方头文件与Rcpp一起使用。但是,这个问题足够不同,以至于我认为我会将它摆成自己的问题。

我有一个名为的头文件coolStuff.h,其中包含一个awesomeSauce(arg1)我想在R包中的cpp文件中调用的函数。

包装结构:

  • 包裹名字

    • 描述
    • [男人]

    • 名称空间

    • [R
      • 一些脚本
    • src
      • theCppFile.cpp
      • otherCppFile.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.cpptheCppFile.cpp哪里打电话

再次感谢您的帮助。我从上一次谈话中学到了很多东西。如果某处有一些标准文档,我会对RTFM感到满意,只需指出正确的方向即可。

c++ r rcpp

5
推荐指数
1
解决办法
2445
查看次数

转换Rcpp NumericMatrix以用于Boost Geometry

我发现,我失去了不漂亮<as><wrap>命令,RCPP及其相关软件包提供了对不同对象类型之间的转换.

我有一个点矩阵,行代表二维笛卡尔空间中的点:

 pointsMatrix <- matrix(runif(100,-1,1),50,50)
Run Code Online (Sandbox Code Playgroud)

然后我想使用boost几何中convex_hull算法来找到点的凸包.

但是,我不确定如何将其转换NumericMatrixconvex_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可能是最好的选择

c++ boost r rcpp boost-geometry

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

标签 统计

c++ ×5

r ×5

rcpp ×4

boost ×2

boost-geometry ×2

roxygen ×1

roxygen2 ×1