R面向对象编程(Object-oriented programming(OOP))

面向对象编程这个概念自从java推出以来就是速度成为一种流行,以至于我们在写c++代码时不得不时刻想象着如何从structure转象class。而对于R来说,也是一样的。R现在主要有两种内置的OOP系统,还有许多扩展包推出。所谓的S3系统(Chambers和Hastie在1992年提出)和S4系统(Chambers于1998年对S3进行了改进,以期提高可靠性及易用性)。S3系统当然也是易用性很高的[……]

Read more

DNA binding motif比对算法

之前介绍了序列比对的一些算法。本节主要讲述motif(有人翻译成结构模式,但本文一律使用基模)的比对算法。

那么什么是基模么?基模是对DNA结合位点的一种描述。它有几种描述方式,一种是共同序列(consensus sequences)一种是位点倾向距阵(Position Specific Frequency Matrices(PSFM))而对于PSFM,有两种表示方式,一种叫PCM,一种叫P[……]

Read more

将R包中的vignettes的Rnw文件转换成PDF文件

一句话命令:

R CMD Sweave foo.Rnw
R CMD texi2dvi foo.tex
or
latex foo
dvipdfm foo

需要将Sweave.sty文件保存在当前目录下。

Sweave.sty内容

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{Sweave}{}
 
\RequirePackage{ifthen}
\newboolean{Sweave@gin}
\setboolean{Sweave@gin}{true}
\newboolean{Sweave@ae}
\setboolean{Sweave@ae}{true}
 
\DeclareOption{nogin}{\setboolean{Sweave@gin}{false}}
\DeclareOption{noae}{\setboolean{Sweave@ae}{false}}
\ProcessOptions
 
\RequirePackage{graphicx,fancyvrb}
\IfFileExists{upquote.sty}{\RequirePackage{upquote}}{}
 
\ifthenelse{\boolean{Sweave@gin}}{\setkeys{Gin}{width=0.8\textwidth}}{}%
\ifthenelse{\boolean{Sweave@ae}}{%
  \RequirePackage[T1]{fontenc}  
  \RequirePackage{ae}
}{}%
 
\DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl}
\DefineVerbatimEnvironment{Soutput}{Verbatim}{}
\DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl}
 
\newenvironment{Schunk}{}{}
 
\newcommand{\Sconcordance}[1]{%
  \ifx\pdfoutput\undefined%
  \csname newcount\endcsname\pdfoutput\fi%
  \ifcase\pdfoutput\special{#1}%
  \else\immediate\pdfobj{#1}\fi}

R调用c++

有了hello world程序,那么就可以象之前一样来试试如何使用Rcpp书写c++代码了。

还是象之前介绍C一样的,我们只讲讲几种R基本类型数据的转入和输出。

test.cpp代码

#include <Rcpp.h>
 
using namespace Rcpp;
 
RcppExport SEXP convert(SEXP Rchar, SEXP Rint, SEXP Rdoub, SEXP Rlogi, 
						SEXP Rchvec, SEXP Rnumvec, SEXP Rlogivec, 
						SEXP Rnummat, SEXP Rchmat, SEXP Rlogimat)
{
	const char* s	=	as<const char*>(Rchar);
	double f	=	as<double>(Rdoub);
	int n		=	as<int>(Rint);
	bool b		=	as<bool>(Rlogi);
	//vectors
	CharacterVector chVec(Rchvec);
	LogicalVector boolVec(Rlogivec);
	NumericVector doubleVect(Rnumvec);
	//matrix
	NumericMatrix doubleMat(Rnummat);
	LogicalMatrix boolMat(Rlogimat);
	CharacterMatrix chMat(Rchmat);
 
	//returned type will be converted by RcppExport macro.
	return List::create(Named("chVec")=chVec,
						Named("boolVec")=boolVec,
						Named("doubleVect")=doubleVect,
						Named("doubleMat")=Rnummat,
						Named("boolMat")=boolMat,
						Named("chMat")=chMat);
}

在terminal当前目录下运行

export PKG_LIBS=`Rscript -e "Rcpp:::LdFlags()"`
export PKG_CXXFLAGS=`Rscript -e "Rcpp:::CxxFlags()"`
R CMD SHLIB test.cpp

或者[……]

Read more

R调用c++的hello world程序

刚刚介绍了如何调用C,那么C++可以吗?R本来是只认C代码的,当然如果你使用C++代码编译也可以通过,但是R却无法调用它。

如果想在R中调用C++代码,那就必须使用Rcpp。使用Rcpp非常简单。
首先我们还是来一个hello qiuworld吧。
首先看一眼目录结构。

·- mypackage
	|- DESCRIPTION
	|- NAMESPACE
	·- R
	|	|- rcpp_hello_world.R
	·- man
	|	|- mypackage-package.Rd
		|- rcpp_hello_world.Rd
	·- src
		|- Makevars
		|- Makevars.win
		|- rcpp_hello_world.cpp
		|- rcpp_hello_world.h

在rcpp_hello_world.R[……]

Read more

R当中调用C

之前写了一小篇R调用C程序,只是一个很小的引子,示例一下如何使用R调用c程序。

文中提到R与C之间数据传递的方式只能通过形参的方式返回,是真的吗?当然不是。真正的R可调用的C程序的变量类型一般都是SEXP。那么SEXP是什么呢?SEXP其实就是一个指针。它指向的是一个数据结构SEXPREC,它被分为了三个部分,sxpinfo,data以及union。sxpinfo是一个32-bit的结构体。[……]

Read more

使用Rcpp库在R下书写c++程序遭遇”memory not mapped”错误

但凡遇到内存错误都会让我感觉到头大。因为debug太难,很多时候都感觉无从下手。

这次在使用Rcpp库写了一小段c++程序,用来建一个复杂的树,以提高运行效率,但却遭遇到了”memory not mapped”错误。这个错误出现是有一定概率的。使用相同的代码,在64-bit下的R(OSX)不报错,但是在32-bit下的R(OSX)就报错,在64-bit linux下也报错。

有人说,[……]

Read more