如何制作自己的R包


如何制作自己的R包?



摘自 方匡南 等編著《R數據分析-方法與案例詳解》.電子工業出版社


R包簡介

R包提供了一個加載所需代碼、數據和文件的集合。R軟件自身就包含大約30種不同功能的包,這些基本包提供了R軟件的基本功能。與此同時,R作為一個開源軟件,它提供了各種統計計算函數,從而方便使用者能夠靈活機動的進行數據分析,甚至創造出符合特定需要的新統計計算方法,而這些函數大多是以包的形式提供,這些都是世界各地R用戶自己編寫的,並上傳到網上分享。因此,制作出屬於用戶自己的R包,並與全世界的R用戶共享是一件非常有意思的事情。
在開始R包的制作之前,首先對R包的基本結構進行簡要的介紹。R包的基本結構如下:
package (包的名字)
|
|--DESCRIPTION (描述文件,包括包名、版本號、標題、描述、依賴關系等)
|--NAMESPACE (包的命名空間文件)
|--R (函數源碼)
   |--function1.R
   |--function2.R
   |--...
|--man (幫助文檔,存放函數說明文件的目錄)
   |--function1.Rd
   |--Package.Rd
   |--...
|--...
其中,DESCRIPTION是包描述文件,它是一個純文本文件,其中記錄了與R包有關的信息,它沒有擴展名,Windows用戶可以用記事本打開。DESCRIPTION包含以下基本內容,注意只有幾個字段是必須的,其它都可選:
Package: package name        /表示包的名稱
Type: Package               /表示R-Project的類型,R包對應的為“Package”
Title: What the package does (short line)     /標題,簡要描述R包功能
Version: 1.0                            /記錄R包的版本信息
Date: when the package is built           /記錄R包的制作時間
Author: Who wrote it                    /記錄R包的作者
Maintainer: Who to complain to <yourfault@somewhere.net>   /記錄R包的維護者
Description: More about what it does (maybe more than one line)  /詳細描述R包的功能
License: What license is it under?           /表示R包的使用許可

包的命名空間NAMESPACE是R包管理包內對象的一個途徑,它可以幫助R包的作者控制保內的哪些函數對象是對用戶可見的,哪些對象是從別的包導入(import),哪些對象從包中導出(export)。當我們在寫一個R包時,有時候會涉及到許多函數,但是其中一些函數可能只是為了方便其它函數的編寫而被抽象獨立出來的子函數,這些子函數只需要被R包中的其他函數調用,對於外界用戶而言並沒有什么幫助,因此它們不需要對外界用戶可見。NAMESPACE文件就提供了這樣一個功能,我們可以通過在包的根目錄下創建一個NAMESPACE文件,通過寫上`export(函數名)`來導出那些需要對用戶可見的函數。自R 2.14.0開始,所有的R包都必須有命名空間,如果沒有的話,R也會自動創建。
R文件夾下存放的是R包中所涉及到的,以.r格式保存的函數源文件。
man文件夾下存放的是Rd文件,也就是R幫助的源代碼,一般情況下,R會自動創建與R目錄下的函數對應的.Rd文件以及一個額外的用以描述整個R包情況xxx-Package.Rd文件。
18.2         在windows中制作R包
(1)        制作R包前的R環境配置
首先確保正確安裝R軟件,RGUI或者Rstudio,注意安裝路徑以及軟件語言最好選擇英文以避免可能因為語言出現的錯誤。
目前最新版本的RGUI為R-3.0.2,RGUI的下載地址為(廈門大學鏡像):
http://mirrors.xmu.edu.cn/CRAN/bin/windows/base/
目前最新版本的Rstudio為RStudio v0.98,下載地址為:
http://www.rstudio.com/ide/download/
而制作R包的工具軟件主要有Rtools,MikTeX或Ctex (如果不需要pdf的幫助手冊,則不需要安裝)
其中,Rtools是制作R包最重要也是最主要的工具,Rtools包含了windows環境下制作R包的一系列工具,其中包括:
1.        CYGWIN,用以在windows環境模擬UNIX環境。
2.        MinGW編譯器,用以編譯C和Fortran語言。
3.        Perl編譯器,用以編譯Perl語言。
最新版本的Rtools的下載地址為(廈門大學鏡像):
http://mirrors.xmu.edu.cn/CRAN/bin/windows/Rtools/
在完成上述軟件的安裝后,我們需要對文件的啟動路徑進行設置從而使得可以通過cmd命令行直接調用Rtools等相應軟件。
具體操作為:右鍵點擊計算機>屬性>高級系統設置>環境變量>系統變量  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:\Program Files\R\R-3.0.2\bin\;



在完成上述步驟之后,打開cmd命令行窗口,輸入R cmd –help 以檢測R環境是否成功配置,正確配置后返回的結果如下圖所示:


(2)        制作R包前的R環境配置
在Windows下編寫R程序包通常包括以下幾步:
1.        編寫.r函數源代碼,也就是用來生成R程序包的函數腳本。
在本文的演示中,假如現在我們已經有了一個編好的R函數Hello,用來在屏幕上輸出問候:
hello<-function(name)
{
                       print(paste("Hello",name))
}
存成了r腳本的格式,文件名為Hello.r
2.        利用R軟件自帶的package.skeleton()函數,生成R包中的Description 文件和幫助文件.rd。
運行的代碼為:
rm(list=ls())       
#清空R工作內存
setwd("D:/R-Pkg-Produce")    
#設定R軟件“工作目錄”,即R包的生成目錄,但需要提前在路徑建立對應的文件夾
package.skeleton(name="hello",code_files="D:/R-Pkg-Produce/hello.r")
#將待打包函數裝載進工作內存,構建R包文件結構,生成相應的文件夾及其下面的文件,軟件包名為"hello",文件是“hello.r”

R軟件回顯信息如下,表明包搭建成功。
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './hello/Read-and-delete-me'.

3.        按要求填寫生成的Description 文件和幫助文件.rd
上述代碼執行完畢之后,將在目錄D:\R-Pkg-Produce下自動生成一個與R包名字相同的文件夾,該文件夾下的內容就是R包的基本框架,包括Read-and-delete-me,DESCRIPTION文件,r文件夾,man文件夾,接下來所要進行的工作就是用記事本打開相應的文件,按要求將其填寫完整,再進行相應的編譯即可。
本例子中的hello-package.Rd文件編寫如下:
\name{hello-package}
\alias{hello-package}
\title{a hello function demo}
\description{
a hello function demo
}
\usage{
hello(name)
}
\arguments{
  \item{name}{a word}
}
\details{
nothing
}
\value{
no return
}
\references{
nothing
}
Hello.rd文件的編寫與hello-package.Rd文件類似,需要注意的是,rd文件中的\title項一定需要填入內容,否則會導致R CMD的check過程出錯。本例子中的hello.Rd文件編寫如下,注意,與hello-package.Rd文件相比,在hello.Rd我們有選擇地保留了一小部分內容。
\name{hello}
\alias{hello}
%- Also NEED an '\alias' for EACH other topic documented here.
\title{
function hello(x) to say hello x
}
\description{
this function hello() provides a package demo
}
\usage{
hello(name)
}

DESCRIPTION文件編寫如下:
Package: hello
Type: Package
Title: Say hello
Version: 1.0
Date: 2013-12-23
Author: Developer 
Maintainer: Developer <Developer@some.domain.net>
Description: This package provides a package demo
License: GPL (>= 2)

特別地,在Rstudio這一R語言的IDE( Integrated Development Environment,集成開發環境)中,Rstudio提供了完全可視化的R包制作接口,上述的R包描述性文件均可在Rstudio中直接編輯。
4.在windows cmd的命令行中輸入相應的命令,生成zip文件或者.tar.gz,並進行相應的檢查。
打開Cmd窗口:<開始>\<運行>\<Cmd>
首先輸入:cd D:/R-Pkg-Produce   #其目的是將工作目錄更改至先前設定的R包路徑下
再輸入:R CMD check D:/R-Pkg-Produce/hello   #檢查r包hello
執行結果如下:

最后輸入:R CMD build D:/R-Pkg-Produce/hello
運行成功后顯示如下信息:

將在C:\Users\用戶名(在本例中為C:\Users\Administrator)路徑下生成一個hello_1.0.tar.gz,即為我們所需要的R包。
在Rstudio的控制台中輸入:
install.packages("C:/Users/Administrator/hello_1.0.tar.gz", repos = NULL, type = "source")
回顯信息如下,R包成功安裝。
* installing *source* package 'hello' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (hello)
調用生成的R包進行測試,運行結果如下:
> library(hello)
> hello("world")
[1] "Hello world

摘自 方匡南 等編著《R數據分析-方法與案例詳解》.電子工業出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM