• R语言
  • 写了一篇简单的R package制作教程

见我的博客。希望对初学者会有用,老手可以忽略。因为以前被那个<Writing R extensions>搞得一头雾水才想到要写一个简单版的,降低入门门槛。

http://www.wentrue.net/blog/?p=395





原文如下:



R package的最简单制作



R的强大之处在于它包罗万有的包,几乎任何领域都可以从CRAN里找到你所需要的实现。



如果有一些功能你希望自己来实现,又或者是用别人的包用多了,希望自己做一个,那么这是一个简单的向导。可以告诉你怎么去制作一个最简单的R包,如果你需要用到复杂的功能,可以再深入地查看资料,我以后也会根据自己的实践深入写一写。



其实最原始最详尽的R包制作指南应该是官方文档<Writing R extensions>,但看过的人无一不觉得这是个累赘,它面面俱到地说了所有的事情,但令初学制作者无所适从。那么,摒弃里面的大部分内容,你真正需要的东西是这样的(以下说明基于linux平台,windows用户也可参考):



    * 准备工作



   1. 指定两个目录,一个是工作目录mydir(/home/wentrue/work),一个是包目录mylib(如/home/wentrue/Rlibs)。前者是你写R代码、运行R console的地方,后者是安装包的地方。

   2. 默认情况下在mydir是找不到mylib下的包的,因为mylib不在包的搜索路径里,解决这个问题只需要在mydir新建一个文件.Rprofile文件,里面写上:.libPaths(”/home/wentrue/Rlibs”)即可。这样在mydir运行R脚本或启动R终端,mylib就会被添加到包搜索路径中。



    * 添加目录与文件



   1. 在mydir新建一个目录,名为once,作为包名。然后生成一些目录,目录树结构见下:



          $ tree once

          once

          |– DESCRIPTION

          |– R

          |   |– test.R

          |   `– zzz.R

          |– data

          |– man

          `– src



   2. 目录说明:必需的是DESCRIPTION文件、man目录和R目录,剩下的都是可选的。DESCRIPTION文件描述包的meta信息,后面会有一个附例;R目录下面存放R脚本文件,里面的函数可导出作为包函数库提供给外部使用;如果要在包里放一些试验数据,可以放在 data目录里,常用是以csv格式存放,在R终端里data(***)可以载入,这里留空;man目录是R的帮助文档,即?xxx时显示的那些,有一定的格式要求,这里也留空;src存放c/c++/fortran源代码,必须同时放置Makefile或Makevars文件指导编译程序工作,这里留空。

   3. 作为试验,我在test.R里写了一个简单的函数,内容见下,里面的oncetest函数在once被装载时就可以被R直接调用。



          oncetest <- function(x, y)

          {

          return(x*y)

          }



   4. zzz.R可以在载入包时做一些事情,这里留空。

   5. 一个简单的包就这样做好了,是不是很简单。如果有其它需要,只要往R目录或src目录添加文件就可以了。



    * 安装与试验(以下步骤都在mydir目录进行)



   1. 运行R CMD check once,R会检查包看是否能正确安装(并未实际安装),如果不成功会返回ERROR,并有出错信息。这个实验里会有一些warning,是因为一些目录留空的缘故,不用管它。

   2. 运行R CMD build once,会生成一个once_0.1.tar.gz安装包,其中的数字是我在DESCRIPTION里写的版本号。

   3. 运行R CMD INSTALL -l /home/wentrue/Rlibs once_0.1.tar.gz,就可以把包安装到mylib里。

   4. 运行R,进入R终端;library(once),载入刚制作的包;search(),可以看到once已经被载入。

   5. 在R终端运行oncetest(2,3),返回6,试验成功。



附:我的DESCRIPTION文件内容



Package: once

Version: 0.1

Date: 2009-07-31

Title: Once Test

Author: Guozhu Wen <xxx@gmail.com>

Maintainer: Guozhu Wen <xxx@gmail.com>

Depends: R (>= 1.9.0)

Description: A Once Test Description

License: GPL version 2 or later



参考:http://www.maths.bris.ac.uk/~maman/computerstuff/Rhelp/Rpackages.html



补充:最典型的一个应用是,你已经积累下来一批自己写的常用的R函数,但又不想每次都一个个文件source进来,那么,把它们分类做成package吧,就可以像平常用其它package一样使用这些函数了,发布给别人用也方便得多。



转载请保留本文原始链接:http://www.wentrue.net/blog/?p=395
不错,下次发个mac版的,那就全了,

不过说实话,自己做的时候还是需要再看看writting R Extension

加深下理解
这里是丁国辉写的一个Win下的制作步骤,我觉得简单明了:

http://rbbs.biosino.org/Rbbs/posts/list/6.page



另外,每每看这种分步骤的操作说明,看英文的越发觉得乱,反而中文的总结的很清楚,一步步实现下来,什么问题都明白了,而看英文的简直是痛苦啊,而且没有见人总结过像中文这样的简单易懂的步骤。英文的说明恨不得把计算的原理都给你讲一讲,所以看得很是费劲,不过如果坚持把英文的看懂,以后应该会快一些。
5 天 后
下面是在下写的一点内容,希望大家多提宝贵意见



如何在windows中编写R程序包



by helixcn



在Windows环境下如何编写R程序包,即生成供linux环境编译运行的tar.gz文件,也生成供windows下使用的.zip文件呢?其实并不复杂,只要下载一些工具软件,按照相应的步骤填写相应的“表格”,继而运行一些简单的指令,就可以生成R的程序包了。



编写R程序包通常包括以下几步:



(1)       工具软件Rtools的安装和备选软件的安装。

(2)       r脚本的准备,也就是用来生成程序包的函数脚本。

(3)       利用R中自带的package.skeleton()函数,生成制作包所需要的Description 文件和帮助文件帮助文件.rd。

(4)       编辑该函数生成的Description 文件和帮助文件.rd

(5)       在windows cmd的命令行中输入相应的命令,生成zip文件或者.tar.gz



下面我们来一起建立只有一个函数的R程序包,来详细说明:



一 工具软件安装和配置

制作r包的工具软件包括Rtools,HTML编译器,MikTeX 或Cte等(备选软件不一定要安装):



1 工具软件安装

(1)Rtools(制作R包的主要工具)

Rtools是在windows下制作R包的一系列工具,其中包括

1)              CYGWIN 在Windows下模拟UNIX环境

2)              MinGW编译器,可用来编译C和Fortran语言。

3)              Perl

下载地址: http://www.murdoch-sutherland.com/Rtools/



(2) 微软HTML编译器(备选):



用来从源文件生成HTML格式的帮助文件

下载地址:http://go.microsoft.com/fwlink/?LinkId=14188



(3) MikTeX 或CteX(备选)

用来生成PDF格式的帮助文件

下载地址:http://www.miktex.org/     www.ctex.org/

分别按照要求安装好。



2 设置文件启动路径:

我的电脑>属性>高级>环境变量>系统变量  PATH一项,点击“编辑”,检查是否具有以下路径,如果没有,需要手工添加:

c:\Rtools\bin;c:\Rtools\perl\bin;c:\Rtools\MinGW\bin; C:\CTEX\MiKTeX\miktex\bin;C:\CTEX\CTeX\ctex\bin;C:\CTEX\CTeX\cct\bin;C:\CTEX\CTeX\ty\bin;C:\CTEX\Ghostscript\gs8.64\bin;C:\CTEX\GSview\gsview;C:\CTEX\WinEdt;C:\Program Files\R\R-2.9.0\bin\;

设置启动路径的目的是在cmd命令行可以直接调用相应的exe文件。



二 R脚本的准备

假如现在我们已经有了一个编好的R函数,用来给出回归的精确结果,存成了r脚本的格式,文件名为linmod.r

其内容如下所示,那么该如何制作R程序包呢?



linmod<- function(x, y)

{

## compute QR-decomposition of x

qx <- qr(x)

## compute (x'x)^(-1) x'y

coef <- solve.qr(qx, y)

## degrees of freedom and standard deviation of residuals

df <- nrow(x)-ncol(x)

sigma2 <- sum((y - x%*%coef)^2)/df

## compute sigma^2 * (x'x)^-1

vcov <- sigma2 * chol2inv(qx$qr)

colnames(vcov) <- rownames(vcov) <- colnames(x)

list(coefficients = coef,

vcov = vcov,

sigma = sqrt(sigma2),

df = df)

}



三 R包框架的准备

1 生成准备文件

登陆R :开始>所有程序>R>R.2.9.0

(1)清除内存中的对象:

rm(list=ls())

(2)设定工作目录,这里设定为 c:/pa

setwd("c:/pa")

(3)将制作包的源文件 linmod.r拷贝到c:/pa/文件夹下,

之后输入:

package.skeleton(name="linmod",code_files="c:/pa/linmod.r")



此时,R控制台中显示

Creating directories ...

Creating DESCRIPTION ...

Creating Read-and-delete-me ...

Saving functions and data ...

Making help files ...

Done.

Further steps are described in './linmod/Read-and-delete-me'.

>



可以看到c:/pa文件夹下新出现了一个linmod文件夹

该文件夹下的内容就是R包的框架,包括data文件夹,man文件夹,只要按要求将其填写完整,再进行相应的编译即可。

首先查看Read-and-delete-me文件

文件内容如下:



* Edit the help file skeletons in 'man', possibly combining help

  files for multiple functions.

* Put any C/C++/Fortran code in 'src'.

* If you have compiled code, add a .First.lib() function in 'R' to

load the shared library.

* Run R CMD build to build the package tarball.

* Run R CMD check to check the package tarball.

Read "Writing R Extensions" for more information.



大致意思如下:

可以man文件夹下编辑帮助文件

C/C++/Fortran 的源代码应该放入src文件夹下

需要在登录时载入包

可以运行R CMD建立和检查相应的包

查看更多信息,应该阅读Writing R Extensions



2 编辑Description文件和rd文件

(1) Description文件的编辑

按照提示,填好各项



Package: linmod

Type: Package

Title: test for linear regression

Version: 1.0

Date: 2009-07-20

Author: helixcn

Maintainer: helixcn <zhangjl@ibcas.ac.cn>

Description: To give the exactly results of linear regression.

License: GNU 2 or later

LazyLoad: yes





(2)man文件夹中.rd文件编辑

man文件夹中包含两个文件 linmod.Rd和linmod-package.Rd,分别是对linmod()函数和linmod包的介绍,下面逐项填写:



1) linmod.Rd

\name{linmod}

\Rdversion{1.1}

\alias{linmod}

%- Also NEED an '\alias' for EACH other topic documented here.

\title{

linear regression

}

\description{

to give the more exactly results of linear regression

}

\usage{

linmod(x, y)

}

%- maybe also 'usage' for other objects documented here.

\arguments{

  \item{x}{

a numeric design matrix for the model

}

  \item{y}{

a numeric vector of responses

}

}

\details{

%%  ~~ If necessary, more details than the description above ~~

}

\value{



%%  ~Describe the value returned

%%  If it is a LIST, use

%%  \item{comp1 }{Description of 'comp1'}

%%  \item{comp2 }{Description of 'comp2'}

%% ...

}

\references{

Friedrich Leisch,2008 Creating R Packages: A Tutorial

}

\author{

helixcn

}

\note{

Please read Friedrich Leisch,2008

}

%% ~Make other sections like Warning with \section{Warning }{....} ~



\seealso{

%% ~~objects to See Also as \code{\link{help}}, ~~~

}

\examples{

##---- Should be DIRECTLY executable !! ----

##-- ==>  Define data, use random,

##--   or do  help(data=index)  for the standard data sets.

## The function is currently defined as

function (x, y)

{

    qx <- qr(x)

    coef <- solve.qr(qx, y)

    df <- nrow(x) - ncol(x)

    sigma2 <- sum((y - x \%*\% coef)^2)/df

    vcov <- sigma2 * chol2inv(qx$qr)

    colnames(vcov) <- rownames(vcov) <- colnames(x)

    list(coefficients = coef, vcov = vcov, sigma = sqrt(sigma2),

        df = df)

  }

}

% Add one or more standard keywords, see file 'KEYWORDS' in the

% R documentation directory.

\keyword{ ~kwd1 }

\keyword{ ~kwd2 }% __ONLY ONE__ keyword per line







2)linmod-package.Rd

\name{linmod-package}

\Rdversion{1.1}

\alias{linmod-package}

\alias{linmod}

\docType{package}

\title{Linear Regression Modification}

\description{to Give the more exactly output of linear regression rather than R default}

\details{

\tabular{ll}{

Package: \tab linmod\cr

Type: \tab Package\cr

Version: \tab 1.0\cr

Date: \tab 2009-07-20\cr

License: \tab GNU 2.0 or later\cr

LazyLoad: \tab yes\cr

}

~~The aim of the package was to give the more exactly output of linear regression~~ linmod~~

}

\author{helixcn

Maintainer: helixcn <helixcn@163.com>}

\references{

Friedrich Leisch,2008,Creating R Packages: A Tutorial

}

\seealso{lm}

\examples{

data(cats, package="MASS")

mod1 <- linmod(Hwt~Bwt*Sex, data=cats)

mod1

summary(mod1)

}





四 通过cmd创建R包



开始>运行>cmd

键入 cd c:\pa\   将工作目录转移到c:/pa下



键入 Rcmd build --binary linmod  制作window zip包

键入 Rcmd build linmod  制作linux平台下可运行的tar.gz包

命令运行完之后可以发现,在c:/pa/文件夹下分别生成了linmod.zip和linmod.tar.gz压缩包。





参考网址

[1]http://www.robjhyndman.com/researchtips/building-r-packages-for-windows/

[2]http://cran.r-project.org/doc/contrib/Leisch-CreatingPackages.pdf

[3]http://faculty.chicagobooth.edu/peter.rossi/research/bayes%20book/bayesm/Making%20R%20Packages%20Under%20Windows.pdf

[4]http://www.biostat.uni-hannover.de/teaching/fallstudien/schaarschmidt2.pdf
赞[s:17]很详细



简单入门之后参考着一些成熟的包的写法再深入就可以了。



r的优势之一在于它无所不包的cran,每个用r的同学都应该学着写自己的package[s:14]



[quote]引用第5楼helixcn于2009-08-06 22:30发表的  :

下面是在下写的一点内容,希望大家多提宝贵意见



如何在windows中编写R程序包



by helixcn

.......

[/quote]