目的:将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