[R]Rstudio中建立包含Rcpp的R包

       目的:将cvxclustr包修改为自己需要的rocvxclustr包。

       初步学习:Rstudio中建立包含Rcpp的R包。

       过程不顺利:花了2天时间解决问题,主要是此方面相对系统的资料很少。

1. 环境--安装Rtools

   检查path是否有2个Rtools相关路径

2. 入门1--- hello world

step 1 :

      在Rstudio界面,

       Files -> New Project -> New Directory -> R package ->

              注意:Type一定选择 [Package w/Rcpp]              ->

              输入Package name: hello                                     -> create project


step 2:  模板介绍

       src 文件夹下有 1. rcpp_hello.cpp     -- c++函数,rcpp_hello()

                                 2. RcppExports.cpp -- 其不可以删除,删除了也会自动再出现。

       R 文件夹下有   1. hello.R                   -- 其直接调用了R function,没什么用,可删除

                                 2.RcppExports.R     -- 其不可删除,删除了也会自动再出现。其调用了rcpp_hello.cpp的rcpp_hello()函数

step 3:

           可以删除 hello.R  和 hello.Rd,也可以不删

           Build -> check   

           最后出现: R CMD check succeeded

step 4: 

            Build & Reload

           在Console中出现了 library(hello),用rcpp_hello()检测结果,建包成功!!!


3. 入门2-- 稍微改变模板

step 1:

         同2,建立package命名test

step 2: 

  1)  src文件夹下:rcpp_hello.cpp + RcppExports.cpp  

 (1)  rcpp_hello.cpp 改成 

---------------cpp 开始-----------------------------------

#include
#include
using namespace std;
using namespace Rcpp;


// This is a simple function using Rcpp that creates an R list
// containing a character vector and a numeric vector.
//
// Learn more about how to use Rcpp at:
//
//   http://www.rcpp.org/
//   http://adv-r.had.co.nz/Rcpp.html
//
// and browse examples of code using Rcpp at:
//
//   http://gallery.rcpp.org/
//

// [[Rcpp::export]]
double dsum(double i,double j) {
  double z = i + j;
  //cout << z<< endl;
  return z;
}

--------------------cpp 结束-----------------------------------

(2) 

注意: RcppExports.cpp 会自动产生对应修改,不用管!

【RcppExports.cpp负责 所有cpp文件与R文件的转换,我的理解】


2)  R文件夹: RcppExports.R

------------------------R开始------------------------------------

# Generated by using Rcpp::compileAttributes() -> do not edit by hand
# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393


dsum <- function(i, j) {
    .Call('test_dsum', PACKAGE = 'test', i, j)
}

-------------------------R结束--------------------------          

表明了对 c++文件中 dsum函数 的调用,

注意:可自动修复调用处的错误,

           此处的函数名 dsum 必须与要调用的c++函数名 dsum 一致。  

 

3)    man 文件夹-- rcpp_hello.Rd

注意:不可以放飞自我,不管此处,不然check时会出错

----------------------开始----------------------

\name{dsum}
\alias{dsum}
\title{dsum}
\usage{
dsum(i,j)
}
\description{
Returns an \R \code{list} containing the character vector
\code{c("foo", "bar")} and the numeric vector \code{c(0, 1)}.
}
\examples{
i <- 1.1
j <- 1.2
dsum(i,j)
}  

-----------------------结束---------------------        

此处: description部分懒得改,不影响;

           title、examples部分必须改!!!


step 3/ step 4, 同2

在console: 

      > library(test)
      > dsum(1.1,1.1)
      [1] 2.2


4. 总结:

其实,很简单,只是未找到系统性的资料,出错很多,细节自己琢磨的,麻烦!!!


【补充】

http://blog.sciencenet.cn/blog-255662-835970.html   提到:

如果要生成EccentricityR的帮助文件,如下:

EccentricityR <- function(JD) {

   .Call('Eccentricity', JD, PACKAGE = 'skycalc')

}

 需要将该函数粘贴到R console中, 之后运行R命令 prompt(EccentricityR),所形成的EccentricityR.Rd 文件需要进一步根据 参数的意义填写和编辑。之后放到man文件夹下。


参考资料:

     1. 仅调用Rcpp,没有建立包

           http://blog.fens.me/r-cpp-rcpp/

     2. R建包,包中只有R文件,无c++文件

        https://cos.name/2013/12/rcpp-introduction/

    3.  和我目的一致,但加载不出图片

       https://translate.google.com.hk/translate?hl=zh-CN&sl=zh-TW&u=http://rainbow7177.blogspot.com/2014/08/r-studio-rcpp-package-cc-code-r-package.html&prev=search

  4.  进阶版本,待学习

     http://dirk.eddelbuettel.com/code/rcpp.html

你可能感兴趣的:(R语言)