<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>糗世界</title>
	<atom:link href="http://www.qiuworld.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.qiuworld.com/blog</link>
	<description>欢迎来到糗糗的世界</description>
	<lastBuildDate>Thu, 19 Jan 2012 21:02:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MZK-NAS02上构架轻小型网站服务器(lighttpd, mysqld, php-mysql)</title>
		<link>http://www.qiuworld.com/blog/archives/2599</link>
		<comments>http://www.qiuworld.com/blog/archives/2599#comments</comments>
		<pubDate>Thu, 19 Jan 2012 21:02:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[站长日记]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2599</guid>
		<description><![CDATA[首先升级到最新的firmware,这一步是为了可以使用ssh登录。如果你是第一次登录的话，密码是空的。
<pre lang='c'>
qiuworld$ ssh root@192.168.2.2
root@192.168.2.2's password: 
Last login: Thu Jan  1 10:08:45 1970 from 192.168.2.3
Linux (none) 2.6.10_mvl401_AG_NAS_3.1.1.exported #1 Thu Sep 6 11:57:38 JST 2007 armv5tejl GNU/Linux

Welcome to MontaVista(R) Linux(R) Professional Edition 4.0.1 (0502020).


root@(none):~#
</pre>

系统时间非常不正确。
<pre lang='c'>
root@(none):~# date --set "Wed Jan 18 23:21:21 JST 2012"
Wed Jan 18 23:21:21 JST 2012
</pre>

安装funplug，funplug的作用是安装编译好的软件。因为NAS一般都不带有编译环境，所以使用编译好的比较理想。
<pre lang='c'>
root@(none):~# cd /
root@(none):/# mkdir ffp
root@(none):ffp# cd ffp
root@(none):ffp# wget http://www.inreto.de/dns323/fun-plug/0.5/fun_plug.tgz
root@(none):ffp# tar -zxf fun_plug.tgz
root@(none):ffp# export PATH=/ffp/bin:/ffp/sbin:$PATH
</pre>
<pre>
funplug命令
funpkg -i *.tgz 安裝
funpkg -u *.tgz 升級
funpkg -r *.tgz 移除
</pre>
停止nashttpd程序，nashttpd是系统自带的www网站程序，它其实是和lighttpd类似，但是否完全一致，无法判断。
<pre lang='c'>
root@(none):~# killall nashttpd
</pre>
funplug包里自带着lighttpd,接下来就是要下载mysql,php即可。系统本来是自带php的，致于如何使用，可能以后有时间了研究。
<pre lang='c'>
root@(none):ffp# wget http://81.216.140.39/dns-323/mysql_and_php/mysql-5.1.28-rc-1.tgz
root@(none):ffp# wget http://81.216.140.39/dns-323/mysql_and_php/php-5.2.6-mysql51-1.tgz
root@(none):ffp# funpkg -i mysql-5.1.28-rc-1.tgz
root@(none):ffp# funpkg -i php-5.2.6-mysql51-1.tgz
root@(none):ffp# chmod u+x /ffp/start/mysqld.sh
root@(none):ffp# chmod u+x /ffp/start/lighttpd.sh
root@(none):ffp# /ffp/start/mysqld.sh start
</pre>
这之后，系统并未启动mysqld。因为安全的原因，mysql是不能以root权限启动的。为些，我们需要为mysql创建用户，并为其把开mysql database所在目录的读写权限。需要使用vi编辑一个名为my.cnf的文件。文件内容为
<pre>
[mysql]
user = mysql
</pre>
<pre lang='c'>
root@(none):ffp# vi etc/my.cnf #写入上面的内容，:wq保存退出
root@(none):ffp# useradd -g mysql mysql
root@(none):ffp# chown -R mysql:mysql /ffp/var/mysql
root@(none):ffp# chmod o+w /ffp/var #目的是为了让mysql可以在/ffp/var/下写入mysql.sock文件
root@(none):ffp# start/mysqld.sh start
root@(none):ffp# mysqladmin -u root password 'new-password'
</pre>
设置php，在php.ini当中加入或者修改下面的几行：
<pre>
extension_dir= "/ffp/lib/php/extensions/no-debug-non-zts-20060613/"
extension=mysql.so
</pre>
设置并启动lighttpd。需要设置的有以下几项：
<pre>
server.document-root = "/ffp/www/pages/"
server.upload-dirs = "/ffp/www/tmp"
server.errorlog = "/ffp/www/logs/error.log"
accesslog.filename = "/ffp/www/logs/access.log"
server.port = 80
</pre>
<pre lang='c'>
root@(none):ffp# cp etc/examples/lighttpd.conf-with-php etc/lighttpd.conf
root@(none):ffp# vi etc/lighttpd.conf #逐行找到上面的内容，依次修改，保存退出
root@(none):ffp# start/lighttpd.sh start
</pre>
至此，似乎是一切OK了。但是如果想安装word-press，那运行起来是非常慢的。所以自己写了一个小型的博客网站，运行，速度还算不错。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2599/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R安装遇到的两个小问题</title>
		<link>http://www.qiuworld.com/blog/archives/2597</link>
		<comments>http://www.qiuworld.com/blog/archives/2597#comments</comments>
		<pubDate>Wed, 04 Jan 2012 20:15:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[bioconductor]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2597</guid>
		<description><![CDATA[1， 出现Error in readRDS(file) : error reading from the connection错误。
出现的原因，安装过程中死机，导致安装不完整。
解决办法，
在Ｒ当中
<pre lang="c" escaped='true'>&#62; .libPaths()
[1] "/usr/local/lib64/R/library"</pre>
进入/usr/local/lib64/R/library下删除最新安装的所有library。将BiocInstaller也删除掉。然后再使用
<pre lang="c" escaped='true'>&#62; source("http://bioconductor.org/biocLite.R")
biocLite()</pre>就可以了。

2，出现Warning: unable to access index for repository http://software.rc.fas.harvard.edu/mirrors/R/src/contrib

使用chooseCRANmirror()重选一下即可。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No irq handler for vector</title>
		<link>http://www.qiuworld.com/blog/archives/2593</link>
		<comments>http://www.qiuworld.com/blog/archives/2593#comments</comments>
		<pubDate>Wed, 04 Jan 2012 15:48:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2593</guid>
		<description><![CDATA[在安装了CentOS6.2之后，遇到了传说中的
kernel:do_IRQ: 3.189 No irq handler for vector (irq -1)
错误。其中3.189不一定，可能是0.189, 1.89, 2.189 ...。这里，189是IRQ中断号，而前面的数字，我推测，应该是CPU号。

在网上查了无数资料，大多数人给出的答案是修改boot文件参数，加上pci=nomsi,noaer就可以了。可是我试过之后，发现还是会出现这个错误。一但出错之后，可能的情况是两个，1，死机数秒后恢复正常。2，自动关机。

为些，大力google research。得出以下的可能的原因：
a) 硬件故障
b) 硬件驱动不正确。它可能注册了无法响应的IRQ号。
c) 硬件驱动有bug，在响应共用的IRQ号的过程中不通畅。
d) 不良的APIC (programmable interrupt controller)将PCI设备中断号指向了错误的IRQ号。

提出的诊断办法有：
<pre>lspci -v</pre>
查看出错的中断号来自于什么硬件

<pre>cat /proc/interrupts</pre>
查看注册了的中断号，注意这个注册的中断号可能被许多硬件设备共用。

如果上面都没有查出什么问题的话，最有可能的就是原因d了。可以在启动文件中加入noapic参数来关闭不良的APIC。

可以查看 /var/log/syslog 当中有没有什么关于出错中断号的信息。

可以使用dmesg命令来查看启动过程记录。

启动文件在/boot/grub/menu.lst
打开它<pre>vi /boot/grub/menu.lst</pre>
<pre lang='c'>
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-220.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/vg_cbb-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_cbb/lv_root rd_LVM_LV=vg_cbb/lv_swap rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM noapic pci=nomsi,noaer
        initrd /initramfs-2.6.32-220.el6.x86_64.img
</pre>

注意其中加入的noapic pci=nomsi,noaer参数。

至此，似乎一切正常。

后来又遇到187中断错误。再查，加上了acpi=off参数。发现81~190都是高级电源管理的中断。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2593/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>两个wordle</title>
		<link>http://www.qiuworld.com/blog/archives/2589</link>
		<comments>http://www.qiuworld.com/blog/archives/2589#comments</comments>
		<pubDate>Fri, 30 Dec 2011 16:17:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[无聊图集]]></category>
		<category><![CDATA[图片搜索]]></category>
		<category><![CDATA[幻灯片]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2589</guid>
		<description><![CDATA[第一个是世界人口数决定的国家名称图：
<a href="http://www.wordle.net/show/wrdl/4617550/Country_Name_by_population" title="Wordle: Country Name by population"><img src="http://www.wordle.net/thumb/wrdl/4617550/Country_Name_by_population" alt="Wordle: Country Name by population" style="padding:4px;border:1px solid #ddd"></a>

第二个是新年快乐图：
<a href="http://www.wordle.net/show/wrdl/4617568/happy_new_years" title="Wordle: happy new years"><img src="http://www.wordle.net/thumb/wrdl/4617568/happy_new_years" alt="Wordle: happy new years" style="padding:4px;border:1px solid #ddd"></a>]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2589/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Circos系列教程（四）连线 links</title>
		<link>http://www.qiuworld.com/blog/archives/2579</link>
		<comments>http://www.qiuworld.com/blog/archives/2579#comments</comments>
		<pubDate>Fri, 23 Dec 2011 05:45:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[生物信息学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2579</guid>
		<description><![CDATA[这一节的目标是画出下面的图

[caption id="attachment_2580" align="alignnone" width="400" caption="连线"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/link.png"><img class="size-full wp-image-2580" title="link" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/link.png" alt="连线" width="400" height="400" /></a>[/caption]

所谓连线，就是连接染色体组两个不同位置的线。这是circos的最主要目的及用途之一。<!--more-->

[caption id="attachment_2544" align="alignnone" width="560" caption="circos流程图"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/circos-architecture.png"><img class="size-large wp-image-2544" title="circos-architecture" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/circos-architecture-560x311.png" alt="circos流程图" width="560" height="311" /></a>[/caption]

首先需要定义数据结构。这里还需要第二节的关于<a href="http://www.qiuworld.com/blog/archives/2519" target="_blank">染色体组型(karyotypes)数据结构</a>的知识。

<strong>数据结构</strong>
<pre lang="c">LABEL ID START END</pre>
这里的LABEL是连线的名称，因为两点确定一条线，所以基本上连线的数据都是同一个名称出现两行数据，分别记录线两端对应的染色体组位置。ID对应的是karyotypes数据文件当中的ID，start和end分别定义起始和终止的位置。下面就是具体的例子：
<pre lang="c">segdup00001 hs1 465 30596
segdup00001 hs2 114046768 114076456
segdup00002 hs1 486 76975
segdup00002 hs15 100263879 100338121</pre>
数据保存在文本文件当中就可以了，之后由conf文件调用。

当然这一数据文件可以更复杂，用于定义每条线的起止半径，色彩，以及宽度等等。比如
<pre lang="c">segdup00011 hs1 71096 76975 thickness=5
segdup00011 hs1 388076 393885 thickness=5
segdup00051 hs1 116091 121750 color=blue
segdup00051 hs7 55828312 55834013 color=blue
segdup00004 hs1 486 9707 radius=0.8r
segdup00004 hsY 57762276 57771573</pre>
<strong>设置文件</strong>

与之前一致的，我们需要设置好circos的设置文件，它需要包括前一节介绍的全部：circos.conf, ideogram.conf,和ticks.conf来定义一，数据源，二如何画染色体，三如何画坐标。而links的部分，直接定在circos.conf文件当中也好，或者写在links.conf当中，由circos.conf来调用也是一样的。我们来看具体circos.conf的示例：
<pre lang="c" escaped="true">
&#60;&#62;
&#60;&#62;

&#60;&#62;

&#60;&#62;
&#60;&#62;

&#60;&#62;

karyotype   = data/karyotype/karyotype.human.hg19.txt

chromosomes_units = 1000000
chromosomes       = hs1;hs2;hs3
chromosomes_display_default = no

# chromosomes_radius = hs2:0.9r;hs3:0.8r</pre>
这一部分，与之前一节别而二致。其下的内容就是如何载入links的数据了：
<pre lang="c" escaped="true"># Links (bezier curves or straight lines) are defined in  blocks.
# Each link data set is defined within a named  block. The name
# of the block is arbitrary, but must be unique.
#
# As with highlights, parameters defined
# in the root of  affect all data sets and are considered
# global settings. Individual parameters value can be refined by
# values defined within  blocks, or additionally on each
# data line within the input file.

z             = 0
radius        = 0.975r
bezier_radius = 0.2r

show         = yes
color        = black_a5
thickness    = 2
file         = data/5/segdup.txt
record_limit = 5000</pre>
在links的定义当中，自定义属性有：
<pre lang="c">r0 - highlight的内径
r1 - highlight的外径
offset - 内外径的偏移值
fill_color - highlight slice的填充色
stroke_color - highlight边框颜色,如果指定的边框大小的话
stroke_thickness - 边框大小
z - z轴，决定着划图的先后次序，后画的可能会盖住先画的
ideogram - toggles the position of the highlight to be within the ideogram extent

radius = 定义连线终止的半径; 在使用相对比例尺时，当radius &#60; 1 时，连线会画在染色体组内，否则边线会画在染色体组外
bezier_radius = 决定曲线的第三点位置，如果不设置，连线就会以直线的形式出现。
color = 连线的颜色
thickness = 连线的粗细
record_limit = 从数据文件中读取多少组数据。在debug的时候会很有用。</pre>
设置好设置文件之后，就可以使用circos出图了。
<pre lang="c">/path/to/circos/bin/circos -conf path/to/circos.conf</pre>
注意，这里include会从circos所在的目录开始寻找，而不是当前目录。

[caption id="attachment_2581" align="alignnone" width="560" caption="连线图"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/links0.png"><img class="size-large wp-image-2581" title="links0" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/links0-560x560.png" alt="" width="560" height="560" /></a>[/caption]

上面的画出来的图，使用的是最简单的数据结构。如果我们需要对每一条线都分别定义色彩，位置等属性，那就需要使用上面提到的复杂的数据结构了。其效果如下：

[caption id="attachment_2582" align="alignnone" width="560" caption="彩色links"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/links_colored.png"><img class="size-large wp-image-2582" title="links_colored" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/links_colored-560x560.png" alt="" width="560" height="560" /></a>[/caption]

[caption id="attachment_2583" align="alignnone" width="560" caption="bezier_radius参数"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/bezier_radius.png"><img class="size-large wp-image-2583" title="bezier_radius" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/bezier_radius-560x560.png" alt="" width="560" height="560" /></a>[/caption]

如果对每一条线分别设置属性，有时候会变得很麻烦。如果可以使用筛选条件一次来进行属性定义就方便了。而circos也考虑到了这一点。它可以设置rule，其写法为：
<pre lang="c" escaped="true">
<links>

z      = 0
radius = 0.975r
crest  = 0.5
thickness    = 2
color  = black
bezier_radius        = 0.2r
bezier_radius_purity = 0.5

<link segdup>

file         = data/5/segdup.txt

<rules>
flow = continue
<rule>
importance = 150
condition  = _INTRACHR_
show       = no
</rule>
<rule>
importance = 100
condition  = (_CHR1_ eq "hs1" &#038;& _CHR2_ eq "hs2") &#124;&#124; (_CHR1_ eq "hs2" &#038;& _CHR2_ eq "hs1")
color      = green
z          = 10
</rule>
<rule>
importance = 50
condition  = (_CHR1_ eq "hs2" &#038;& _CHR2_ eq "hs3") &#124;&#124; (_CHR1_ eq "hs3" &#038;& _CHR2_ eq "hs2")
color      = blue
z          = 15
</rule>
</rules>

</link>

</links></pre>
其规则如下(n代表同一名称下的第几个点，一般为1，或者2)：
<pre lang="c">_CHRn_ - 对应着数据格式当中的ID
_STARTn_ - 对应着数据格式当中的START
_ENDn_ - 对应着数据格式当中的END
_POSITIONn_ - middle position of span n in the link
_SIZEn_ - 连线的属性size
_INTERCHR_ - 是否在同一染色体内
_INTRACHR_ - 是否在不同染色体间
_THICKNESSn_ 连线的属性thickness
_COLORn_ 连线的属性color</pre>
可以使用简单的函数比如max,min, abs, eval, rand()等等。字符比较，需要使用ne(不等于), eq(等于)来比较，数值型可以使用&#62;,=,

我们再多看几组示例：
<pre lang="c">
<rule>
importance = 200
condition  = _INTERCHR_ &#38;&#38; ((_CHR1_ eq "hs2" &#38;&#38; _START1_ &#62; 65Mb &#38;&#38; _START1_ &#60; 75Mb) &#124;&#124; (_CHR2_ eq "hs2" &#38;&#38; _START2_ &#62; 65Mb &#38;&#38; _START2_ &#60; 75Mb))
z          = 60
color      = red
thickness  = 5
</rule>

<rule>
importance = 150
condition  = max(_SIZE1_,_SIZE2_) &#62; 40000
z          = 50
color      = black
thickness  = 5
</rule>

<rule>
importance = 250
condition  = _INTRACHR_ &#38;&#38; abs(_POSITION1_ - _POSITION2_) &#60; 50Mb
bezier_radius = 1r
bezier_radius_purity = 0.75
color = lblue
</rule>

<rule>
importance = 225
condition  = _INTRACHR_ 
show = no
</rule>
<rule>
...
thickness = eval(_SIZE1_/1000)
</rule>

<rule>
importance = 100
condition  = 1

thickness  = eval(max(1,log(max(_SIZE1_,_SIZE2_))-5))
radius     = eval(min(_SIZE1_/5,_SIZE2_/5,1150))
color      = eval((qw(grey red orange yellow green blue purple))[ int(min(_SIZE1_/1000,_SIZE2_/1000,6)) ])
z          = eval(int(max(_SIZE1_,_SIZE2_)/100))
</rule>

<rule>
importance = 100
condition  = _COLOR1_ eq "red"
thickness  = 4
z          = 10
</rule>

<rule>
importance = 90
condition  = _COLOR1_ ne "grey" &#038;& _THICKNESS1_ == 2
z          = 5
</rule></pre>
[caption id="attachment_2584" align="alignnone" width="560" caption="条件控制"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/circos.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/circos-560x560.png" alt="" title="circos" width="560" height="560" class="size-large wp-image-2584" /></a>[/caption]

有的时候，我们可能觉着线型太线，不好看，这时可以使用ribbon及flat参数，如：
<pre lang="c">
<links>

z      = 0
radius = 0.99r
crest  = 1
color  = grey_a3
bezier_radius        = 0.2r
bezier_radius_purity = 0.5

<link segdup>
file             = data/5/segdup.txt
ribbon           = yes
flat             = yes
stroke_color     = vdgrey
stroke_thickness = 2

<rules>

flow = continue

<rule>
importance = 250
condition  = _INTRACHR_ &#038;& abs(_POSITION1_ - _POSITION2_) < 10Mb
show       = no
</rule>

<rule>
importance = 200
condition  = max(_SIZE1_,_SIZE2_) < 10000
show       = no
</rule>

<rule>
importance = 150
condition  = 1
z          = eval(int(max(_SIZE1_,_SIZE2_)/5000))
</rule>

<rule>
importance   = 125
condition    = _INTRACHR_ &#038;& ((_CHR1_ eq "hs1" &#038;& _START1_ < 1Mb) &#124;&#124; (_CHR2_ eq "hs1" &#038;& _START2_ < 1Mb))
color        = orange
stroke_color = dorange
</rule>

<rule>
importance   = 115
condition    = _INTRACHR_ &#038;& ((_CHR1_ eq "hs1" &#038;& _START1_ > 16Mb &#038;& _START1_ < 17Mb) &#124;&#124; (_CHR2_ eq "hs1" &#038;& _START2_ > 16Mb &#038;& _START2_ < 17Mb))
color        = lblue
stroke_color = dblue
</rule>

</rules>

</link>

</links>
</pre>
[caption id="attachment_2585" align="alignnone" width="560" caption="ribbon"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/ribbon.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/ribbon-560x560.png" alt="" title="ribbon" width="560" height="560" class="size-large wp-image-2585" /></a>[/caption]

本节所使用的代码下载<a href='http://www.qiuworld.com/blog/wp-content/uploads/2011/12/links.zip'>links</a>]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2579/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Circos系列教程（三）突出标记Highlight</title>
		<link>http://www.qiuworld.com/blog/archives/2554</link>
		<comments>http://www.qiuworld.com/blog/archives/2554#comments</comments>
		<pubDate>Fri, 23 Dec 2011 04:25:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[生物信息学]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2554</guid>
		<description><![CDATA[这一节的目标是画出下面的图

[caption id="attachment_2570" align="alignnone" width="400" caption="亮显强调"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/image.png"><img class="size-full wp-image-2570" title="image" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/image.png" alt="亮显强调" width="400" height="400" /></a>[/caption]

所谓突出标记，或者说亮显强调，多是通过大的反差明显或者符合色彩心理学的色块来将数据分组强调出来。在使用circos绘制基因组时，可以使用这一办法，将不同区域同一组内的基因亮显出来。

[caption id="attachment_2544" align="alignnone" width="560" caption="circos流程图"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/circos-architecture.png"><img class="size-large wp-image-2544" title="circos-architecture" src="http://www.qiuworld.com/blog/wp-content/uploads/2011/11/circos-architecture-560x311.png" alt="circos流程图" width="560" height="311" /></a>[/caption]

首先需要定义数据结构。这里还需要上一节的关于<a href="http://www.qiuworld.com/blog/archives/2519" target="_blank">染色体组型(karyotypes)数据结构</a>的知识。

<strong>数据结构</strong>
<pre lang="c">ID START END</pre>
这里的ID对应的是karyotypes数据文件当中的ID，start和end分别定义起始和终止的位置。下面就是具体的例子：
<pre lang="c">
hs1 0 259871
hs1 669458 2686613
hs1 2727905 3991852
hs1 5645456 6816208
hs1 7553915 14224162
hs1 15152815 16859159
hs1 16973585 17838807
hs1 18630086 29725898
hs1 30758584 34604030
hs1 34793307 35631322
</pre>
数据保存在文本文件当中就可以了，之后由conf文件调用。

当然这一数据文件可以更复杂，用于定义每个highlight的位置，色彩，以及宽度等等。比如
<pre lang="c">
hs1 1298972 1300443 fill_color=blue
hs1 1311738 1324571 fill_color=red,r0=0.6r,r1=0.6r+50p
hs1 1397026 1421444 fill_color=green,r0=1.1r,r1=1.15r
hs1 1437417 1459927 fill_color=green,r0=1.1r,r1=1.15r
hs1 1540746 1555847 fill_color=yellow
hs1 1560962 1645635 fill_color=purple
hs1 1624179 1645623 fill_color=grey
</pre>

<strong>设置文件</strong>

与之前一致的，我们需要设置好circos的设置文件，它需要包括前一节介绍的全部：circos.conf, ideogram.conf,和ticks.conf来定义一，数据源，二如何画染色体，三如何画坐标。而highlight的部分，直接定在circos.conf文件当中也好，或者写在highlight.conf当中，由circos.conf来调用也是一样的。我们来看具体circos.conf的示例：
<pre lang="c">
<colors>
<<include etc/colors.conf>>
<<include etc/brewer.conf>>
</colors>

<fonts>
<<include etc/fonts.conf>>
</fonts>

<<include ideogram.conf>>
<<include ticks.conf>>

<image>
<<include etc/image.conf>>
</image>

karyotype   = data/karyotype/karyotype.human.hg19.txt

chromosomes_units           = 1000000
chromosomes_display_default = no
chromosomes                 = hs1;hs2;hs3
</pre>
这一部分，与之前一节别而二致。其下的内容就是如何载入highlight的数据了：
<pre lang="c">
################################################################
#
# define highlights within <highlights> block
#
# note that the radial axis grid is drawn on top of the highlights

<highlights>

# the default value for z-depth and fill_color for all highlights

z = 0
fill_color = green

# drawn from 60% radius to inner edge of ideogram
# radius and will be green (default color)
<highlight>
file       = data/3/genes.large.txt
r0         = 0.6r
r1         = dims(ideogram,radius_inner)
</highlight>

# the second set will be drawn on top of the first (higher z-depth)
# and will be 100px wide in the radial direction, starting at 0.7x of
# the ideogram radius
<highlight>
file       = data/3/genes.large.txt
r0         = 0.7r
r1         = 0.7r + 100p
z          = 5
fill_color = red
</highlight>

# by drawing black with transparency, you can darken the color
# in the track below
<highlight>
file       = data/3/genes.large.txt
r0         = 0.7r + 100p
r1         = 0.7r + 200p
z          = 10
fill_color = black_a5
</highlight>

# the third set will be outside the circle (r0,r1>1) and will be
# blue with dark blue border around each highlight

<highlight>
file         = data/3/genes.large.txt
r0           = 1.075r
r1           = 1.125r
fill_color   = blue
stroke_color = vdblue
stroke_thickness = 2
</highlight>

# orange strip in the middle

<highlight>
file         = data/3/genes.large.txt
r0           = 1.09r
r1           = 1.11r
fill_color   = orange
z            = 5
</highlight>

</highlights>
</pre>
我们注意到，在highlights的定义当中，首先定义了两个默认属性z-depth和fill_color。而每个highlight都可以自定义自己的属性，而在数据文件中，也可以定义得更加具体。
其它可定义的属性有：
<pre lang="c">
r0 - highlight的内径
r1 - highlight的外径
offset - 内外径的偏移值
fill_color - highlight slice的填充色
stroke_color - highlight边框颜色,如果指定的边框大小的话
stroke_thickness - 边框大小
z - z轴，决定着划图的先后次序，后画的可能会盖住先画的
ideogram - toggles the position of the highlight to be within the ideogram extent
</pre>

设置好设置文件之后，就可以使用circos出图了。
<pre lang="c">/path/to/circos/bin/circos -conf path/to/circos.conf</pre>
注意，这里include会从circos所在的目录开始寻找，而不是当前目录。

[caption id="attachment_2572" align="alignnone" width="560" caption="高亮图"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight0.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight0-560x560.png" alt="高亮图" title="highlight0" width="560" height="560" class="size-large wp-image-2572" /></a>[/caption]

上面的画出来的图，使用的是最简单的数据结构。如果我们需要对每一节的高显部分都分明定义色彩，位置等属性，那就需要使用上面提到的复杂的数据结构了。其效果如下：
[caption id="attachment_2573" align="alignnone" width="560" caption="使用不同填充色"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_fill_color.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_fill_color-560x560.png" alt="highlight_fill_color" title="highlight_fill_color" width="560" height="560" class="size-large wp-image-2573" /></a>[/caption][caption id="attachment_2574" align="alignnone" width="560" caption="不同的r0,r1值呈现的效果"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_r.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_r-560x560.png" alt="highlight_r" title="highlight_r" width="560" height="560" class="size-large wp-image-2574" /></a>[/caption][caption id="attachment_2575" align="alignnone" width="560" caption="设置不同的z值呈现叠加效果"]<a href="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_z_index.png"><img src="http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight_z_index-560x560.png" alt="highlight_z_index" title="highlight_z_index" width="560" height="560" class="size-large wp-image-2575" /></a>[/caption]

本节所使用的代码下载<a href='http://www.qiuworld.com/blog/wp-content/uploads/2011/12/highlight.zip'>highlight</a>]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2554/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R数据分析当中的化整为零（Split-Apply-Combine）策略</title>
		<link>http://www.qiuworld.com/blog/archives/2564</link>
		<comments>http://www.qiuworld.com/blog/archives/2564#comments</comments>
		<pubDate>Mon, 12 Dec 2011 16:58:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[bioconductor]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2564</guid>
		<description><![CDATA[本文心得自：The Split-Apply-Combine Strategy for Data Analysis, Hadley Wickham, Journal of Statistical Software, April 2011, V.40.

<blockquote>引子：
我们常常会遇到这样的问题，数据量很大，并不需要依顺序来依次处理。合理分块处理，并最终整合起来是一个不错的选择。这也就是所谓的Split-Apply-Combine Strategy策略。这在速度上会有比做一个loop有优势，因为它可以并行处理数据。</blockquote>

什么时候我们需要使用到化整为零的策略呢？有以下三种情况：
<ol>
	<li>数据需要分组处理</li>
	<li>数据需要按照每行或者每列来处理</li>
	<li>数据需要分级处理，和分组很类似，但是分级时需要考虑分级之间的关系。</li>
</ol>

化整为零策略有点类似于由Google推广的map-reduce策略。当然map-reduce策略的基础是网格，而这里的Split-Apply-Combine的基础完全可以是单机，甚至不支持并行处理的单机都可以。

然而，化整为零并不是一个很直观的编程过程。最直观的过程是使用Loop循环。这里使用一个例子来讲解一下如何实现化整为零策略。在plyr包中有数据ozone,它是一个三维矩阵(24X24X72)，其中最后一维72是指的6年12个月每个月的结果。也就是ozone是一个包括了连续72个月24Ｘ24的三维矩阵数据。三维分别是lat,long,time。我们需要由对时间robust linear model之后的残基residuals。
<pre lang="perl" escaped="true">
> library(plyr) # need for dataset ozone
> library(MASS) # need for function rlm
> month <- ordered(rep(1:12, length=72)) #set time sequence
> #try one set
> one <- ozone[1,1,]
> model <- rlm(one ~ month - 1); model
Call:
rlm(formula = one ~ month - 1)
Converged in 9 iterations

Coefficients:
  month1   month2   month3   month4   month5   month6   month7   month8   month9  month10  month11  month12 
264.3964 259.2036 255.0000 252.0052 258.5089 265.3387 274.0000 276.6724 277.0000 285.0000 283.6036 273.1964 

Degrees of freedom: 72 total; 60 residual
Scale estimate: 4.45 
> deseas <- resid(model)
</pre>
<!--more-->
现在我们对每一组数据都做相同的处理。首先使用for loop，这样比较直观
<pre lang="perl" escaped="true">
> deseasf <- function(value) rlm(value ~ month -1) #the function
> models <- as.list(rep(NA, 24*24)) #prepare the variable
> dim(models) <- c(24, 24)
> deseas <- array(NA, c(24,24,72)) #prepare the variable
> dimnames(deseas) <- dimnames(ozone)
> for (i in seq_len(24)) { #for loop for first dimension
+ 	for(j in seq_len(24)) { #for loop for second dimension
+ 		mod <- deseasf(ozone[i, j, ]) #apply function
+ 		models[[i, j]] <- mod #save data
+ 		deseas[i, j, ] <- resid(mod) #get residure
+ 	}
+ }
</pre>

接下来我们使用化整为零的策略。因为数据可以分成24X24块来处理，每一块都是单独运算，可以并行处理。而使用for loop，只能一块接一块的处理，在速度上可能没有并行处理来得快。而在R当中，有一系列相关的函数，apply, lapply, sapply, tapply, mapply, sweep。我们先得了解这些函数，然后再来应用它们。最简单的是apply。

其形式是apply(array, margin, function, ...)。首先,apply的对象是矩阵array或者matrix。它的第二个参数是指的维度，如果你的array是一个二维矩阵，需要按横排的方式计算每一排的平均值，那么你的第二个参数就应该是1。如果需要按纵列的方式计算每一列的平均值，那么第二个参数就应该是2。当然还可以使用c(1,2)这样的方式来设置第二个参数，就是并行计算每个值。第三个参数是需要应用的函数。之后的...是需要传入函数的其它参数。而apply的返回值就是由function来确定的，它可能是vector, array or list。下面举个例子比较容易理解。

<pre lang="perl" escaped="true">
> x<-cbind(x1=3,x2=c(4:1,2:5))
> dimnames(x)[[1]]<-letters[1:8]
> x
  x1 x2
a  3  4
b  3  3
c  3  2
d  3  1
e  3  2
f  3  3
g  3  4
h  3  5
> apply(x,2,mean,trim =.2) #在这里，trim =.2就是mean(x, trim = 0, na.rm = FALSE, ...)函数当中的一个参数。
x1 x2 
 3  3 
> apply(x,1,mean,trim =.2)
  a   b   c   d   e   f   g   h 
3.5 3.0 2.5 2.0 2.5 3.0 3.5 4.0 
> col.sums <- apply(x, 2, sum)
> row.sums <- apply(x, 1, sum)
> rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))
     x1 x2 Rtot
a     3  4    7
b     3  3    6
c     3  2    5
d     3  1    4
e     3  2    5
f     3  3    6
g     3  4    7
h     3  5    8
Ctot 24 24   48
> sum.plus.y <- function(x,y){
+ 	sum(x) + y
+ }
> apply(x, 1, sum.plus.y, 3) #使用自定义函数
 a  b  c  d  e  f  g  h 
10  9  8  7  8  9 10 11 
</pre>

理解了apply,就可比较容易地理解lapply, sapply, vapply了。这三者针对的对象是list或者Vector。其形式为
<pre lang="perl">
lapply(X, FUN, ...)
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
</pre>
我们看到，它没有了apply当中所需要的第二个参数margin，其原因就是输入对象不是array或者matrix，而是list或者Vector。先举个最简单的应用例子。
<pre lang="perl" escaped="true">
> x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
> x
$a
 [1]  1  2  3  4  5  6  7  8  9 10

$beta
[1]  0.04978707  0.13533528  0.36787944  1.00000000  2.71828183  7.38905610 20.08553692

$logic
[1]  TRUE FALSE FALSE  TRUE

> lapply(x,mean)
$a
[1] 5.5

$beta
[1] 4.535125

$logic
[1] 0.5

</pre>
也就是说，其x的维度应该是一维的，当然，其下面的元素可以是多维的。那么如果x是一个矩阵呢？我们先来看例子。
<pre lang="perl" escaped="true">
> x<-cbind(x1=3,x2=c(4:1,2:5))
> dimnames(x)[[1]]<-letters[1:8]
> x
  x1 x2
a  3  4
b  3  3
c  3  2
d  3  1
e  3  2
f  3  3
g  3  4
h  3  5
> x<-as.data.frame(x)
> as.list(x)
$x1
[1] 3 3 3 3 3 3 3 3

$x2
[1] 4 3 2 1 2 3 4 5

> lapply(x,function(.ele) mean(.ele))
$x1
[1] 3

$x2
[1] 3

> sapply(x,mean)
x1 x2 
 3  3 
> vapply(x,mean,1)
x1 x2 
 3  3 
</pre>
从它们的说明文件我们知道，无论你传入的x是什么，它首先做的一步说是使用as.list来将其转换成一个一维的list。所以，一个data.frame传入lapply之后，它的colnames将会转换成list的names,而rownames可能会丢失。比较可知，lapply和sapply的差别在于，lapply的返回值是一个list，而sapply的返回值是一个矩阵。sapply的返回值其实就是在lapply的基础上再使用了simplify2array(x, higher=TRUE)函数，使用其结果变成一个array。为了更清楚地了解sapply和vapply，我们看下面的例子
<pre lang="perl" escaped="true">
> i39 <- sapply(3:9, seq)
> i39
[[1]]
[1] 1 2 3

[[2]]
[1] 1 2 3 4

[[3]]
[1] 1 2 3 4 5

[[4]]
[1] 1 2 3 4 5 6

[[5]]
[1] 1 2 3 4 5 6 7

[[6]]
[1] 1 2 3 4 5 6 7 8

[[7]]
[1] 1 2 3 4 5 6 7 8 9

> sapply(i39, fivenum)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]  1.0  1.0    1  1.0  1.0  1.0    1
[2,]  1.5  1.5    2  2.0  2.5  2.5    3
[3,]  2.0  2.5    3  3.5  4.0  4.5    5
[4,]  2.5  3.5    4  5.0  5.5  6.5    7
[5,]  3.0  4.0    5  6.0  7.0  8.0    9
> vapply(i39, fivenum,
+        c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))
        [,1] [,2] [,3] [,4] [,5] [,6] [,7]
Min.     1.0  1.0    1  1.0  1.0  1.0    1
1st Qu.  1.5  1.5    2  2.0  2.5  2.5    3
Median   2.0  2.5    3  3.5  4.0  4.5    5
3rd Qu.  2.5  3.5    4  5.0  5.5  6.5    7
Max.     3.0  4.0    5  6.0  7.0  8.0    9
</pre>
其中，fivenum函数会返回一组数的最小值，四分位低值(lower-hinge)，中值，四分位高值(upper-hinge)，以及最大值。从上面的比较中，我们很清楚的看到，sapply返回值的排列形式，以list的names为colnames。可以想象，它使用的是按列填充matrix的方式输出的。而vapply是在sapply的基础上，为rownames做出了定义。

除了上面介绍的，还有tapply,mapply,sweep等。它们的定义如下。如果需要了解和掌握它们，需要熟悉上面介绍的apply, lapply, sapply以及vapply。还需要了解split。所以这里就不多加解释了（因为篇幅会很长）。
<pre lang="perl">
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
       USE.NAMES = TRUE)
sweep(x, MARGIN, STATS, FUN="-", check.margin=TRUE, ...)
</pre>

有了上面的了解，我们可以看一下最前面的for loop可以怎样改写为apply形式了。
<pre lang="perl" escaped="true">
> models <- apply(ozone, 1:2, deseasf) #这里相当于for loop当中的for(i in seq_len(24)){for(j in seq_len(24)){mod<-deseasf(ozone[i,j,]); models[[i,j]]<-mod;}}, 但是运算却是并行处理的。
> resids_list <- lapply(models, resid)
> resids <- unlist(resids_list)
> dim(resids) <- c(72, 24, 24)
> deseas <- aperm(resids, c(2, 3, 1))
> dimnames(deseas) <- dimnames(ozone)
</pre>

如果，我们知道的并不是ozone这样一个24X24X72的已知确切维度的三维数组，假如我们只有一个名为ozonedf的matrix，它的5列分别为lat, long, time, month,和value。我们如果需要做上述的分析应该怎么办呢？在思路上，我们的想法可能会是先从ozonedf出发生成一个类似ozone这样子的数据，然后再使用apply,lapply这样的函数来完成就可以。第一步生成ozone这样子的数据，就是化整为零策略(Split-Apply-Combine)的第一步了。
<pre lang="perl" escaped="true">
R> deseasf_df <- function(df) {
+ rlm(value ~ month - 1, data = df)
+ }
R> pieces <- split(ozonedf, list(ozonedf$lat, ozonedf$long))
R> models <- lapply(pieces, deseasf_df)
R> results <- mapply(function(model, df) {
+ cbind(df[rep(1, 72), c("lat", "long")], resid(model))
+ }, models, pieces)
R> deseasdf <- do.call("rbind", results)
</pre>

我们再来举一个airquality的例子，我们先来构造一个比较复杂的数据。
<pre lang="perl" escaped="true">
> aq<-airquality
> aq$source<-"qiuworld"
> head(aq)
  Ozone Solar.R Wind Temp Month Day   source
1    41     190  7.4   67     5   1 qiuworld
2    36     118  8.0   72     5   2 qiuworld
3    12     149 12.6   74     5   3 qiuworld
4    18     313 11.5   62     5   4 qiuworld
5    NA      NA 14.3   56     5   5 qiuworld
6    28      NA 14.9   66     5   6 qiuworld
> aq1<-aq
> aq1$source<-c("gaziou")
> head(aq1)
  Ozone Solar.R Wind Temp Month Day source
1    41     190  7.4   67     5   1 gaziou
2    36     118  8.0   72     5   2 gaziou
3    12     149 12.6   74     5   3 gaziou
4    18     313 11.5   62     5   4 gaziou
5    NA      NA 14.3   56     5   5 gaziou
6    28      NA 14.9   66     5   6 gaziou
> set.seed(123)
> x1<-runif(nrow(aq1),-0.5,0.5)
> head(x1)
[1] -0.21242248  0.28830514 -0.09102308  0.38301740  0.44046728 -0.45444350
> aq1$Temp<-aq1$Temp+x1
> head(aq1$Temp)
[1] 66.78758 72.28831 73.90898 62.38302 56.44047 65.54556
> aq<-rbind(aq,aq1)
> aq<-aq[order(aq$Wind),]
> head(aq)
    Ozone Solar.R Wind     Temp Month Day   source
53     NA      59  1.7 76.00000     6  22 qiuworld
206    NA      59  1.7 76.29892     6  22   gaziou
121   118     225  2.3 94.00000     8  29 qiuworld
274   118     225  2.3 94.14789     8  29   gaziou
126    73     183  2.8 93.00000     9   3 qiuworld
279    73     183  2.8 93.48422     9   3   gaziou
</pre>
我们的任务就是比较不同source来源的每个Month的平均Temp。思路应该是先把数据按照source和Month分成小块，计算出来其Temp的平均值，然后输出。这就是一个完整而简单的Split-Apply-Combine的过程了。
<pre lang="perl" escaped="true">
> pieces <- split(aq, list(aq$source,aq$Month))
> pieces[1:2]
$gaziou.5
    Ozone Solar.R Wind     Temp Month Day source
183   115     223  5.7 78.64711     5  30 gaziou
164     7      NA  6.9 74.45683     5  11 gaziou
154    41     190  7.4 66.78758     5   1 gaziou
184    37     279  7.4 76.46302     5  31 gaziou
155    36     118  8.0 72.28831     5   2 gaziou
180    NA      NA  8.0 57.04407     5  27 gaziou
160    23     299  8.6 65.02811     5   7 gaziou
163    NA     194  8.6 68.95661     5  10 gaziou
166    11     290  9.2 66.17757     5  13 gaziou
165    16     256  9.7 68.95333     5  12 gaziou
173    11      44  9.7 62.45450     5  20 gaziou
174     1       8  9.7 59.38954     5  21 gaziou
176     4      25  9.7 61.14051     5  23 gaziou
167    14     274 10.9 68.07263     5  14 gaziou
157    18     313 11.5 62.38302     5   4 gaziou
169    14     334 11.5 64.39982     5  16 gaziou
172    30     322 11.5 67.82792     5  19 gaziou
170    34     307 12.0 65.74609     5  17 gaziou
177    32      92 12.0 61.49427     5  24 gaziou
181    23      13 12.0 67.09414     5  28 gaziou
156    12     149 12.6 73.90898     5   3 gaziou
168    18      65 13.2 57.60292     5  15 gaziou
161    19      99 13.8 59.39242     5   8 gaziou
158    NA      NA 14.3 56.44047     5   5 gaziou
159    28      NA 14.9 65.54556     5   6 gaziou
179    NA     266 14.9 58.20853     5  26 gaziou
182    45     252 14.9 80.78916     5  29 gaziou
175    11     320 16.6 73.19280     5  22 gaziou
178    NA      66 16.6 57.15571     5  25 gaziou
171     6      78 18.4 56.54206     5  18 gaziou
162     8      19 20.1 61.05144     5   9 gaziou

$qiuworld.5
   Ozone Solar.R Wind Temp Month Day   source
30   115     223  5.7   79     5  30 qiuworld
11     7      NA  6.9   74     5  11 qiuworld
1     41     190  7.4   67     5   1 qiuworld
31    37     279  7.4   76     5  31 qiuworld
2     36     118  8.0   72     5   2 qiuworld
27    NA      NA  8.0   57     5  27 qiuworld
7     23     299  8.6   65     5   7 qiuworld
10    NA     194  8.6   69     5  10 qiuworld
13    11     290  9.2   66     5  13 qiuworld
12    16     256  9.7   69     5  12 qiuworld
20    11      44  9.7   62     5  20 qiuworld
21     1       8  9.7   59     5  21 qiuworld
23     4      25  9.7   61     5  23 qiuworld
14    14     274 10.9   68     5  14 qiuworld
4     18     313 11.5   62     5   4 qiuworld
16    14     334 11.5   64     5  16 qiuworld
19    30     322 11.5   68     5  19 qiuworld
17    34     307 12.0   66     5  17 qiuworld
24    32      92 12.0   61     5  24 qiuworld
28    23      13 12.0   67     5  28 qiuworld
3     12     149 12.6   74     5   3 qiuworld
15    18      65 13.2   58     5  15 qiuworld
8     19      99 13.8   59     5   8 qiuworld
5     NA      NA 14.3   56     5   5 qiuworld
6     28      NA 14.9   66     5   6 qiuworld
26    NA     266 14.9   58     5  26 qiuworld
29    45     252 14.9   81     5  29 qiuworld
22    11     320 16.6   73     5  22 qiuworld
25    NA      66 16.6   57     5  25 qiuworld
18     6      78 18.4   57     5  18 qiuworld
9      8      19 20.1   61     5   9 qiuworld

> avgTemp<-lapply(pieces,function(.ele) mean(.ele$Temp))
> head(avgTemp)
$gaziou.5
[1] 65.63339

$qiuworld.5
[1] 65.54839

$gaziou.6
[1] 79.02871

$qiuworld.6
[1] 79.1

$gaziou.7
[1] 83.90313

$qiuworld.7
[1] 83.90323

> avgTemp<-do.call(rbind,avgTemp)
> head(avgTemp)
               [,1]
gaziou.5   65.63339
qiuworld.5 65.54839
gaziou.6   79.02871
qiuworld.6 79.10000
gaziou.7   83.90313
qiuworld.7 83.90323
</pre>

由上面的过程我们可以看来，其实化整为零策略在实现起来，就是分三步走，使用split将数据化分成小块，使用lapply函数对小块进行计算，最后使用do.call使用函数将其整理成我们需要的形式。这个过程，其实使用plyr包来实现，就更为便洁了。同样是上面的操作，使用plyr的话，只需要一行即可。
<pre lang="perl" escaped="true">
> avgTemp1<-ddply(aq,.(source,Month),function(.ele) mean(.ele$Temp))
> avgTemp1
     source Month       V1
1    gaziou     5 65.63339
2    gaziou     6 79.02871
3    gaziou     7 83.90313
4    gaziou     8 83.98611
5    gaziou     9 76.89319
6  qiuworld     5 65.54839
7  qiuworld     6 79.10000
8  qiuworld     7 83.90323
9  qiuworld     8 83.96774
10 qiuworld     9 76.90000
</pre>

plyr包给我们提供了非常简洁的书写方式。我们来看看其主要函数的定义方式。
<table>
<tr><td>Input\output</td><td>Array</td><td>Data frame</td><td>List</td><td>Discarded</td></tr>
<tr><td>Array</td><td>aaply</td><td>adply</td><td>alply</td><td>a_ply</td></tr>
<tr><td>Data frame</td><td>daply</td><td>ddply</td><td>dlply</td><td>d_ply</td></tr>
<tr><td>List</td><td>laply</td><td>ldply</td><td>llply</td><td>l_ply</td></tr>
</table>
<pre lang="perl">
a*ply(.data, .margins, .fun, ..., .progress = "none")
d*ply(.data, .variables, .fun, ..., .progress = "none")
l*ply(.data, .fun, ..., .progress = "none")
</pre>
我们可以看出，函数名称的第一个字母代表输入的形式，它们分别是a->Array, d->Data frame, l->List。而第二字母代表输出的形式，它们的定义同前。对于输入为array和data frame的，函数的第二个参数为data的margins或者variables。对于margins,可以是
<ul>
<li>.margins = 1 #以行为单位</li>
<li>.margins = 2 #以列为单位</li>
<li>.margins = c(1,2) #以individual cell为单位</li>
</ul>
需要注意的是，这里的每一个参数都使用了.点号起始。在作者看来，这样可以避免误操作。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2564/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apache server停止响应了应该怎么办？</title>
		<link>http://www.qiuworld.com/blog/archives/2562</link>
		<comments>http://www.qiuworld.com/blog/archives/2562#comments</comments>
		<pubDate>Tue, 06 Dec 2011 17:48:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2562</guid>
		<description><![CDATA[写了一个php页，但是总是运行到一半的时候停止响应，页面停留在上一页上。

第一步，先ping服务器，看服务器是否死机或者脱网。ping IP.如果并非物理性脱网，服务器可能受到了DDoS攻击。

第二步，如果服务器没有脱网，登录服务器，ssh xxx@xxx.com。如果远程登录不了，就超出了本文的范围。如果可以登录，需要留看内存，cpu占用情况。
<pre lang='perl'>
[qiuworld@qiuworld.com]$ free -m #查看内存情况
[qiuworld@qiuworld.com]$ top #press q to quit 查看程序运行情况
[qiuworld@qiuworld.com]$ uptime #查看当前加载
[qiuworld@qiuworld.com]$ dmesg #查看内核收到的信息
[qiuworld@qiuworld.com]$ df-h #查看硬盘空间
[qiuworld@qiuworld.com]$ sudo tail /var/log/httpd/error_log #查看apache收到的错误报告
[qiuworld@qiuworld.com]$ ps -aux #查看进程情况
</pre>
通常来说，可能会有以下几种错误：
1，硬盘空间不足。2，内存不足。3，太多进程数。

第三步，查看程序是否包含死循环。查看诸如sleep之类关键字。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2562/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mac OS下R安装universal版本的package</title>
		<link>http://www.qiuworld.com/blog/archives/2560</link>
		<comments>http://www.qiuworld.com/blog/archives/2560#comments</comments>
		<pubDate>Mon, 05 Dec 2011 17:19:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[生物信息学]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2560</guid>
		<description><![CDATA[需要在mac OS X 10.6.8 (snowleopard) 下安装Rgraphviz。直接使用biocLite无法正常安装。手动安装步骤如下，

1. 下载安装<a href="http://www.graphviz.org/Download_macos.php" target="_blank">graphviz</a>.

2. 下载<a href="http://bioconductor.org/packages/devel/bioc/html/Rgraphviz.html" target="_blank">Rgraphviz</a>源文件。使用如下命令：
<pre lang="c">
R CMD INSTALL Rgraphviz_1.33.0.tar.gz
</pre>

3. 安装完成之后在R_32位版本中会提示：
<pre lang='c'>
Error: package ‘Rgraphviz’ is not installed for 'arch=i386'
</pre>
使用命令为i386安装头文件。
<pre lang='c'>
R --arch=i386 CMD INSTALL --libs-only Rgraphviz_1.33.0.tar.gz
</pre>
安装完成之后，重启R，即可正常调用。如果不重启，可能会遇到内存分配错误。]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2560/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery 1.4.2版在IE下不响应$(“select”).live(“change”,function(){})的解决</title>
		<link>http://www.qiuworld.com/blog/archives/2556</link>
		<comments>http://www.qiuworld.com/blog/archives/2556#comments</comments>
		<pubDate>Wed, 30 Nov 2011 15:39:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[程序员]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">http://www.qiuworld.com/blog/?p=2556</guid>
		<description><![CDATA[使用旧版的jquery 1.4.2时，在IE下不响应select的change事件(event)，试过很多办法，包括bind("change click",...)等等，都没有效果。无意间在使用了.delegate()，意外发现问题得到解决。

在调用$(selector).live("change",)前，加入下面的语句：
<pre lang="html">
if($.browser.msie){
	$("body").delegate("select","change",function(){
		//do nothing to fix the IE bugs for unfired change event.
	});
}
</pre>]]></description>
		<wfw:commentRss>http://www.qiuworld.com/blog/archives/2556/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

