请从下面的sas codepage里找出五处错...

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分1阅读权限10帖子精华可用积分1 信誉积分2 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 1, 距离下一级还需 199 积分
帖子主题精华可用积分1 信誉积分2 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
& &&&管理员在拔出服务器上硬盘的时候没有记下哪块硬盘是在哪个插槽。搞乱了它们顺序,现在我要插回去该如何插。因为是raid5,所以我怕直接插会导致数据丢失。请教各位大神,我该如何处理。 联想的服务器,3块300的联想硬盘。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分15阅读权限10帖子精华可用积分15 信誉积分32 专家积分0 在线时间10 小时注册时间最后登录
白手起家, 积分 15, 距离下一级还需 185 积分
帖子主题精华可用积分15 信誉积分32 专家积分0 在线时间10 小时注册时间最后登录
论坛徽章:0
恭喜你数据完蛋了……
不过三块硬盘的话,据说先找两块插上,不断试顺序,可能有用。
仅供参考,还是找专业数据公司吧
UID空间积分0 积分43486阅读权限90帖子精华可用积分48789 信誉积分2318 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 信誉积分2318 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
印象中新的 RAID 卡是把RAID信息保存在硬盘上的. 有个建议可以一试.
先插上一块硬盘, 开机, 进RAID卡的配置, 查看RAID信息, 应该会看到 有一个 RAID, 同时会告诉你 少了两块盘, 你就可以看看是少了哪两块盘.
我不太确定这样真的可以, 楼主自己小心操作. Good Luck !!
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
UID2292276空间积分2 积分17277阅读权限90帖子精华可用积分17277 信誉积分2771 专家积分625 在线时间9468 小时注册时间最后登录
大富大贵, 积分 17277, 距离下一级还需 2723 积分
帖子主题精华可用积分17277 信誉积分2771 专家积分625 在线时间9468 小时注册时间最后登录
论坛徽章:6
上帝保佑你。。。。有1/6的几率一击而中。。。
有时候回答问题是信口开河......
因此不保证所有回复问题的答案的准确性.
如果正好是对的,那是碰到了死耗子..呵呵.
想着休息,不想做事!
hand shock
UID空间积分0 积分251阅读权限20帖子精华可用积分251 信誉积分117 专家积分0 在线时间101 小时注册时间最后登录
稍有积蓄, 积分 251, 距离下一级还需 249 积分
帖子主题精华可用积分251 信誉积分117 专家积分0 在线时间101 小时注册时间最后登录
论坛徽章:0
Good Luck~
UID空间积分0 积分11阅读权限10帖子精华可用积分11 信誉积分149 专家积分0 在线时间42 小时注册时间最后登录
白手起家, 积分 11, 距离下一级还需 189 积分
帖子主题精华可用积分11 信誉积分149 专家积分0 在线时间42 小时注册时间最后登录
论坛徽章:0
反正我遇到的RAID 打乱些盘顺序还是可以的> 【答案带解析】初一年级同学要举办“光盘”演讲活动,邀请春蕾中学的李老师参加。下面是某同学写的请...
初一年级同学要举办“光盘”演讲活动,邀请春蕾中学的李老师参加。下面是某同学写的请柬,在格式和语言上共有五处错误,请找出并改正。(5分)请柬尊敬的李老师A:为发扬中华民族的优良传统B,增强同学们的节约意识,我们年级将于6月20日C在学校的阶梯教室举办以“我与节约”的演讲活动D,特邀请您参加。务必按时到会E。日
阳光中学初一年级F
① A处称呼应顶格写 ② C处应写明具体时间,如下午三点钟
③ D 处“我与节约”后加上宾语,如“为主题 ④ E处“务必”用词不当,可改为“请”
⑤F处落款应先署名后时间
试题分析:应用文体的写作和修改,一般包括两方面内容,一要注意应用文体的格式;二要注意应用文体的内容,格式应是相对固定的;而内容应符合应用文体的的实用性特点。学生学会修改语段中的不当之处。具体表现...
考点分析:
考点1:语言的简明连贯得体
简明:能够使对方明白无误地理解说话人的意思,不重复啰唆,不产生歧义。此点可以具体穿插在病句中考查,也可以与压缩语段、语法的综合修改、修辞等结合起来考查。命题形式一般是列出一段简明的话,让考生判断语病(重复啰唆、有歧义等)并修改。
连贯:书面表达中句与句之间的组合与衔接自然,保持语言连贯。这方面需要兼顾话题(有共同的话题)、句序(合理的句序)和语言的运用(语言的衔接与呼应)三个方面,同时还要注意语境、句式的协调一致。
得体:能根据语境条件恰当地使用语言,即用语能根据表达的目的、对象、场合、方式的差异来调整,与语境保持和谐一致,分寸得当。
& & 那么怎样来复习这部分知识呢?一句话,要把握“简明、连贯、得体”这一语言表达的总体要求,不管题型如何变化,万变不离其宗。&
怎样才能做到简明呢?
首先,要删除多余的语句,避免不必要的重复;
其次,用代词或指代性的短语替换冗长的语句;
第三,避免因表述歧义而造成的误解。词义一定要确定,语序一定要恰当,指代一定要清楚。&
语言应用的第二个要求就是连贯。连贯是指前后句子意思贯通,没有阻碍。
语言表达连贯的训练要注意三个方面的问题:
第一,话题和陈述的角度要保持一致;
第二,句序安排要合理;
第三,注意处理好语言的呼应和衔接。
得体,是语言表达的第三个要求。
& & 它是指根据具体语言环境恰当地使用语言,这是对语言使用的高标准要求。要做到语言得体,
第一要符合语境要求,根据不同的对象、不同的场合、不同的目的、不同的表达方式正确使用语言;
第二要符合语体要求,要根据具体情况来确定是使用口语还是使用书面语。只要我们平时留心,加强训练,我们一定能在任何场合都有得体的语言。&
& & &语言的运用是我们日常交往中必不可少的一环,能够简明、连贯、得体地表达我们的见解,不仅是中招考试的要求,更是我们交往能力的一种体现。所以,我们应该认真对待这方面的训练。&
相关试题推荐
《西游记》中有很多经典的故事情节,如大闹天宫、
、偷吃人参果等。(2分) 
在下面的横线上补写一个与前面句式相同、语意连贯的句子。(2分)读沙漠,读出了它坦荡豪放的胸怀;读太阳,读出了它普照万物的无私;
下列句子没有语病的一项是(
) (2分)A.能不能搞好学习,关键在于对学习有正确的态度。B.现在医学发达,移植记忆不是不可能的事。C.童话《皇帝的新装》的作者是闻名世界的丹麦作家安徒生的作品。D.为了避免道路交通不拥堵,各地纷纷出台交通管理新措施。 
下列句子中划线的成语运用不恰当的一项是(
) (2分)A.于是大家放开喉咙读一阵书,真是人声鼎沸。 B.他讲起故事来栩栩如生,非常吸引人。C.这一摞书,是我第二个理想,想当一名著作等身的作家。D.班会上,他侃侃而谈,出众的口才使得大家对他刮目相看。 
下列填入横线处的词语最恰当的一项是(
) (2分)大熊猫是一种人见人爱的动物。大熊猫喜欢嬉戏,憨态可掬。有时
起来,状似舞蹈;有时背倚石头,坐在草地上悠然自得地
竹枝;有时团作一团,漫不经心地随地打滚;有时
笨拙的身体,摇摇晃晃地在草地上玩耍。A.直立
拉着 B.站立 啃着
拉着 
题型:其他题
难度:中等
Copyright @
满分5 学习网 . All Rights Reserved.一般的RAID HBA 有下面形态的硬件架构:
1.ASIC IOP +IOC
2.FPGA ,CPLD 的IOP +ASIC IOC
RoC (RAID on Chip)
1.ASIC 的RoC
2.FPGA的RoC
ASIC (Application-specific Ic) 这种要Tape out的(好像1000万起跳吧忘了价格..) ,要有量才合算。
LSI 这种Fabless(无半导体工厂) SoC Designer 厂商当然都是ASIC 产品...
FPGA or CPLD 可编程逻辑们阵列,这就比较有弹性了。
比如说一些SSD RAID、DRAM RAID,都是用FPGA实现,但是如果量大是有点不合算。
像H牌这类,部份XOR 就是用FPGA or CPLD,PH
至于FPGA 做SAS PHY 仿真就不多了。&
从RAID Controller的观点来看,它是基于单纯的SAS/SATA HBA上提供了RAID功能(RAID 0, RAID 1, RAID 5, RAID 6,甚至是混合阵列等等..),有些RAID Controller在单个硬盘驱动器情况下可以直接被识别,有些则是必须要建立阵列(Array)才能使用,可能根据Option ROM载入的内容而有所差异。下面是一张AMCC/3ware早期的9690SA-8i RAID Controller,这是一款Hardware RAID,由PowerPC处理器、ASIC XOR Accelerator和Emulex IOC组成经典的StorSwitch分离式架构。在3ware还没被LSI买下以前,长年以来都是应用这种架构,3ware对于早期开发SATA产品中,面对SCSI产品这个架构有相当的优势性,不过现在颇老矣...
最左边那块是存放韧体(Firmware)代码的flash,由于StorSwitch架构没有太多的详细资料,所以我的猜测是这样的:那颗 PowerPC的处理器&&PPC405CR提供266MHz的时钟频率,这颗处理器一般的用途可能是一些平常I/O处理,例如中断执行、flow control、另外还包括了对于RAID code的执行,AMCC握有PowerPC的授权后,不用白不用。中间那颗是AMCC特制的ASIC XOR加速器&&G133 RAID engine,提供大量的DMA通道(32条,StorSwitch架构的特色之一)给更多的Storage使用,附加XOR和RAID 6所使用的GF硬件加速设计,PPC405CR加上G133 RAID engine应该就是一个完整的IOP(I/O 处理器)架构。根据AMCC/3ware之前相关产品资料来看,Cache Memory部分应该是从AMCC ASIC XOR加速器连接,IOC则是使用Emulex的IOC 500S,提供两个wide-port(各包含4条SAS通道)的连接。
就我以前拿4颗Seagate的15k.6 146GB组成RAID 5后进行测试,最佳的情况都无法突破1GB/s的顺序读写传输速度,故此我是认为bottleneck应该是卡在host-bus(主机总线)的带宽问题,也许有可能的情况就是AMCC ASIC XOR加速器连接IOC 500S是用PCI-X bus。当然,这些仅仅是我的一些猜测,其实纵观3ware后期产品来看,并没有太多的改善,不管是9550系列或着9650系列,software部分我倒是认为作的不差。下面是一张LSI的SAS 9211-8i的HBA,提供了IT/IR双模式,在单个硬盘连接情况下,可以直接被识别使用:
这块HBA使用了LSISAS2008芯片,是Hardware RAID架构,内置了一颗PowerPC&&PPC440 at 533MHz的处理器,LSISAS2008的特点是支持了6Gb/s介面的SAS 2.0规格,目前被广泛应用在HBA、ROMB方案下。这颗芯片提供了基础RAID功能,可以从官方文件来看是用来取代LSISAS1068/E的,仅拥有入门级(entry-level)的性能,他跟同门师兄&&LSISAS2108相比,可以说是差了一大截,他没有任何XOR硬件加速设计,没有内存控制器来连接外部内存作为Cache Memory,光缺少这两种特征,足以让RAID性能受到严重的打击。从Intel的一份文件显示,芯片里面整合了一块2MB的context RAM可以用来做为buffer;支持MSI-X特性、IRQ x15,对于SMP/CMP系统来说,在大量I/O的情况下会有所帮助。
在HBA方案中,提供IT(Initiator and Target)模式作为原生SAS模式支持(thx 注这是很特别状况)。
另一种IR(Integrated RAID)模式提供了基础RAID功能实现(RAID 0、RAID 1、RAID 10和RAID 1E),在LSI专有的Fusion-MPT架构,应用了子处理器(pRoCessor)来执行对I/ O的相关操作或着有关RAID的运算。另外ROMB设计方案中,提供一种RAID key的小块物理PCB插件,如下图所示:
透过这个插件而外提供RAID 5模式,不过前面说过,由于没有了XOR硬件加速设计和内存控制器,因此RAID 5性能可以说是不堪入目。在使用RAID key的情况下,BIOS模式会切成IMR(Integrated MegaRAID)模式,这个模式就是MegaRAID产品系列所采用的,提供更多的特性,这与LSI SAS MegaRAID 9240系列是相同的。当切换成IMR模式后,就必须强制建立阵列才能使用,而且使用的IRQ数量只有4组,block size可以选择,但最高只能到64k,支持SSD Guard技术。下面是一张LSI MegaRAID SAS 9240-8i的RAID HBA,归属于MegaRAID产品线,所以可以提供对RAID 5模式的支持:
#page_title(技术分析:深入剖析RAID HBA与架构)
网友评论:0&&
一般RAID就设计上来说分成两种形式:Software RAID和Hardware RAID,我想这玩过或着熟悉相关RAID知识的人大致上都清楚,在说明这两种设计差异之前,并不包含一些特殊的设计,例如某家RAID厂商早期某款产品使用某种程度的XOR硬件加速设计(CPLD/FPGA)来提高性能。
Hardware RAID比较好讲,基本的架构就是IOP+IOC的组合,IOC可以说是SAS/SATA HBA部分,IOP通常只是拿来加速运算用的。先来讲讲Software RAID,根据Adaptec早期提供的一份基础文献(Hardware RAID vs. Software RAID: Which Implementation is Best for my Application?),对于了解Software RAID和Hardware RAID差异是值得参考的,就Software RAID的特征,Software RAID拆成两个部分:纯软件模式 & Operating System Software RAID和Hybrid Model & Hardware-Assisted(硬件辅助) Software RAID。在纯软件模式下,这个模式是非常容易了解的,RAID功能完全取决于操作系统而定,此模式提供最低成本的考量,但是缺点不少,最大的缺点在于他 I/O性能不佳,而且受到Software层级上的限制,意味着它容易被操作系统绑死,下图是一张纯软件模式的基础示意图:
纯软件模式在一般情况下,是不会去应用的,尤其最近这几年来,Hybrid Model & Hardware-Assisted Software RAID反而是最常被用到的,基本上就是SAS/SATA HBA with a RAID BIOS或着是RAID BIOS integrated onto the motherboard,例如Intel的ICHxR就是一个Hardware-Assisted Software RAID,透过额外的硬件加入RAID的支持(将RAID Option ROM写在BIOS里),RAID功能部份可以独立于操作系统,资料安全上也高于纯软件模式,通过系统启动BIOS初始化阶段,可以预先检测到RAID模式的状况,并且提供独立的GUI设定RAID类型,当然在某些RAID模式下,IO性能依然会受到限制,例如典型的RAID 5模式。下面是一张基本的示意图:
这张描述的是以HBA with a RAID BIOS的模型,RAID Software与HBA部分包起来,RAID Software指的是将有关RAID代码部分写在NVRAM里,作为系统启动初始化的时候,获得RAID的相关功能,也包括专属的组态设定 (dedicated GUI and software to build and maintain the RAID)。
这张是我取自Dell网站加以修改的基本HBA with a RAID BIOS结构:
另外这张表示图则是ICHxR实现RAID功能,将RAID Option ROM写到主机板上的System BIOS里,以提供RAID Configuration Utility建立RAID:
Software RAID的相反就是Hardware RAID,如之前所提,典型就是IOP+IOC(A Discrete RAID Controller Card)的组合,IOP作为某些模式(例如RAID 5)的运算加速时,可以提供某种程度上的效益(得视该硬体处理性能而定),并且IOP会包含一些额外的硬件加速设计,当然Hardware RAID花费的组建成本都高于Software RAID,以下是来自Dell的IOP+IOC示意图:
本文章更多内容: -
新闻排行榜⑴“下周”时间不具体,应加具体时间如“下周一”; ⑵把“要求”改为“诚邀”;⑶把“感觉”改为“感受”;⑷《文化达人》改为“文化达人”;⑸格式上,日期应在学校下面。&
评分标准:找出并修改正确,一处得1分;仅找出错误,不修改或修改不准确不给分。修改五处即可得满分得5分。
注:“此致”“敬礼”本文中没有问题
“此致”“敬礼”有两种写法:
(1)可以紧接正文写,图示如下:
……………………………………。此致(此处不需加标点)
敬礼!(此处必须加感叹号)
(2)图示如下:
……………………………………。(正文)
此致(退两个字的位置)
敬礼!(顶格写并加感叹号)
【解析】考查应用文常识。其实这种问题并不新鲜,它有规律可循的。只要注意基本的常识即可。
请在这里输入关键词:
科目:高中语文
下面这则邀请函,在语言、格式及标点使用等方面有多处错误,请找出五处并修改。&&
为了弘扬民族文化,丰富中学生的业余文化生活,我校拟定于下周下午3点在六楼礼堂举办《文化达人》知识竞赛,要求各校领导、老师积极参加。
届时,您会了解到同学们深厚的文化底蕴,您会感觉到他们在文化交流时的激情与魅力,您更能感受到新一代中学生在我们中学校园里的历练与成长。我们恭候您的光临!
&&&&&&&&&&& 此致
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 日
&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&XX学校
⑴把&&&&&&&&&&&&&& 改为 &&&&&&&&&&&&&&&
⑵把&&&&&&&&&&&&&& 改为&&&&&&&&&&&&&&
⑶把&&&&&&&&&&&&&& 改为 &&&&&&&&&&&&&&&
⑷标点错误&&&&&&&&&&&&&& 改为&&&&&&&&&&&&&&
⑸格式错误&&&&&&&&&&&&&& 改为&&&&&&&&&&&&&&
科目:高中语文
来源:2011届黑龙江省哈九中高三第二次模拟考试语文卷
题型:语言表达
下面这则邀请函,在语言、格式及标点使用等方面有多处错误,请找出五处并修改。(5分)&&邀请函为了弘扬民族文化,丰富中学生的业余文化生活,我校拟定于下周下午3点在六楼礼堂举办《文化达人》知识竞赛,要求各校领导、老师积极参加。届时,您会了解到同学们深厚的文化底蕴,您会感觉到他们在文化交流时的激情与魅力,您更能感受到新一代中学生在我们中学校园里的历练与成长。我们恭候您的光临!此致 敬礼! 日 XX学校⑴把&&&&&&&&&&&&&&改为 &&&&&&&&&&&&&&&⑵把&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&⑶把&&&&&&&&&&&&&&改为 &&&&&&&&&&&&&&&⑷标点错误&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&⑸格式错误&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&
科目:高中语文
来源:2014届贵州省高二上学期期中考试语文试卷(解析版)
题型:语言应用
下面这则邀请函有三处语言表达不得体,请找出来并加以改正。(6分)
贵校第五届艺术节将于10月15日~20日举行。我们向教育系统的各位领导、教师及各位家长、校友发出鼎力邀请。届时,您会欣赏到花的绽放,舞的优雅;您会聆听到琴的悠扬,歌的高亢。这里洋溢着青春的激情,激荡着创造的魅力;这里是心灵驰骋的原野,这里是放飞梦想的蓝天。
同行在热情相邀,孩子在期待,母校在召唤,恭候您的惠顾!
(1)将&&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&&&&&&&&&&&;
(2)将&&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&&&&&&&&&&&;
(3)将&&&&&&&&&&&&&&&改为&&&&&&&&&&&&&&&&&&&&&&&&。
科目:高中语文
来源:学年安徽省高三第一次月考语文试卷(解析版)
题型:语言应用
下面这则邀请函有三处语言表达不得体,请找出来并加以改正。(6分)
贵校第五届艺术节将于9月24日~30日举行。我们向教育系统的各位领导、教师及各位家长、校友发出鼎力邀请。届时,您会欣赏到花的绽放,舞的优雅;您会聆听到琴的悠扬,歌的高亢。这里洋溢着青春的激情,激荡着创造的魅力;这里是心灵驰骋的原野,这里是放飞梦想的蓝天。
同行在热情相邀,孩子在期待,母校在召唤,恭候您的惠顾!
(1)将&&&&&&&&&&
改为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

(2)将&&&&&&&&&&
改为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

(3)将&&&&&&&&&&
改为&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
。R 数据的导入和导出
R 数据的导入和导出
R 数据的导入和导出
这是从R中导入或导出数据的一个指导手册。
本文档的当前版本为0.01 β。该文档译自 R-2.6.1 文档(日)。
丁国徽() 译。
本文档的一些发布信息放置在 。
电子表格类似的数据
导入其它统计软件的数据
关系数据库
二进制文件
读取Excel表格文件
函数和变量索引
Previous:&,
英文文档版权声明:
Copyright &
R Development Core Team
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the R Development Core Team.
参考译文如下(具体以英文原文为准):
R Development Core Team
在遵守并包含本文档版权声明的前提下,制作和发布本文档的完整拷贝是允许的。
并且,所有这些拷贝均受到本许可声明的保护。
在遵守上述完整拷贝版本有关版权声明的前提下,拷贝和发布基于本文档完整
拷贝的修改版本是允许的,并且,发布所有通过修改本文档而得到的工作成果,
须使用与本文档的许可声明一致的许可声明。
在遵守上述修改版本版权声明的前提下,拷贝和发布本文档其它语言的翻译版本
是允许的,如果本许可声明有经 R 核心开发小组(R Development Core Team)核
准的当地化译本,则遵循当地化译本。
关于本中文翻译文档的版权声明:
本文档为自由文档(GNU FDL),
在GNU自由文档许可证()下发布,
不明示或者暗示有任何保证。本文档可以自由复制,修改,散布,但请保留使用
许可声明。
Previous:&,
不能期望一个软件可以做所有的事情。R 也不例外。因此,
R 需要和其它东西协作。包括我们人类,需要我们输入数据,导出数据。包括我们的
其它软件,Excel,SPSS,等等,数据格式都是特异的,需要R 特别处理。
包括我们的数据库系统,R
不是用来管理数据的,所以需要专业的数据库帮忙。
也包括不同机器间,上面编译的
R 也是需要交换数据。这一册文档就是描述这些事情的。
R 的主要目的就是分析数据。虽然,你可以用它来处理文档,画个奥运会的鸟巢,R
的主要目的还是数据分析。这是专业化个性化的时代,特色取胜。
这个文档在几年前就写了一些。很实用的一个文档。开发人员可以大致了解
R 和其它软件大致的通讯情况,非开发人员至少可以了解,
R 通过包能直接读取Excel表格。
已经是凌晨了,不多写了。
任何问题和建议可以给Email!
感谢身边的朋友!
Previous:&,
手册中关系数据库的内容部分基于Douglas Bates 和 Saikat DebRoy早期写的
一个手册。本手册主要由 Brian Ripley 编写。
这里用到很多扩展包都是由自愿者贡献。这里提到的包以及主要作者如下,
CORBA Duncan Temple Lang
foreign Thomas Lumley, Saikat DebRoy, Douglas Bates, Duncan Murdoch and Roger Bivand
hdf5 Marcus Daniels
ncdf David Pierce
ncvar Juerg Schmidli
rJava Simon Urbanek
RMySQL David James and Saikat DebRoy
RNetCDF Pavel Michna
RODBC Michael Lapsley and Brian Ripley
RSPerl Duncan Temple Lang
RSPython Duncan Temple Lang
SJava John Chambers and Duncan Temple Lang
XML Duncan Temple Lang
Brian Ripley 是实现R的连接(connection)支持的作者。
Previous:&,
尽管大多数读者觉得统计分析非常有趣,但为统计分析读入数据以及
把结果导出到其它系统以方便报表编写可能是一件比统计分析更花时间
和难办的差事。
本手册描述了 R 自身以及从 CRAN 获得的一些包里面的
数据导入和导出功能。这里描述的一些包可能还正在开发,但它们已经
提供了一些非常有用的功能了。
除非特别说明,本手册中描述的所有功能可以在各种平台运行的R
通常,如R一类的统计系统特别不适合处理大尺度的数据。
其它一些系统在这方面可以比R作的好。本手册的部分要点是
建议用户可以用其它系统做数据处理工作而不是用 R 里面重复的功能(
例如,Therneau 和 Grambsch (2000) 就提到他们喜欢在SAS里面进行数据
处理,然后才用 S 的包 survival 进行数据分析)。
现在,还有几个包允许用其它编程语言(如Java,
perl 和 python)开发的函数直接整合进R代码里面。这样
就可以更加方便地用这些语言的功能。
(见Omegahat项目()
的SJava, RSPerl 和 RSPython包,和来自
CRAN的rJava包)
值得注意到是 R 和 S 一样都来自Unix的小的可重用工具的传统,
因此,在数据导入前和结果导出后用awk 和 perl 等
工具处理数据都是值得推崇的。
Becker, Chambers & Wilks (1988, 第 9 章)中的案例分析就是这样的
一个例子。其中,在 S 数据输入前用Unix工具检验和处理数据。
R 自己也是采用这种策略,比如用 perl 而不是R
处理自身的帮助文件数据库,函数 read.fwf开始就是调用一个
perl代码直到后来明确在运行时不能依赖 perl。
现在,传统的Unix工具被很广泛的使用,包括在Windows系统上。
导出到文本文件中
Previous:&,
1.1 Imports 导入
导入 R 的数据中最容易的格式是简单的文本文件。对于小型或中型的问题,
这种格式都可以接受的。
从文本文件导入数据的原始函数(primary function)是 scan。
电子表格类似数据()一章中讨论的大多数比较便利
的函数都是基于这个原始函数。
但是,所有的统计顾问们对客户用软盘或光盘提交一些私有的二进制数据
(比如,`Excel 电子表格'或`SPSS文件')都比较熟悉。
通常,可以做的最简单的事情是用原始软件把数据用文本文件导出(而统计
顾问们为了这个目的会在他们电脑里面安装大多数常用的软件)。不过,
这不会总是可能的。
在从其它统计软件中导入数据()一章中,我们会讨论一些可以在 R 里面
直接读取这些文件的工具。
对 Excel 电子表格,读取Excel电子表格()
一章对可以获得的相关方法进行了总结。
在很少的一些例子中,出于简洁和快速访问考虑,数据以二进制格式保存。
这种情况下一个例子是我们已经见过几次的图像数据。它通常以二进制流的
方式保存然后在内存里面呈现,而且可能在数据前面加个信息头。
这种数据格式在二进制文件()和二进制连接
()部分都有所讨论。
对于大的数据库数据,通常要借助数据库管理系统(Database management
system,DBMS)来处理。我们可以通过DBMS从数据库里面提取没有格式的
文本文件,但是对于大多数这一类型的DBMS,我们可以直接通过 R
的包来实现数据提取操作:见关系数据库()部分。
通过网络连接来导入数据在网络接口()一章讨论。
Previous:&,
1.2 导出到文本文件中
从 R 里面导出结果通常是一个很少争论的事情,但是实际操作中仍然
有一些问题。在知道目标应用软件前提下,通常把文本文件作为最为便利的
中间转换工具。(如果需要二进制文件,见二进制文件()
函数 cat 是导出数据的函数的基础。它有一个file参数
和append。通过连续地调用 cat 对一个文本文件写入。
最好的方式是,特别需要多次这样做的时候,首先为写入或添加文本
打开一个 file 连接,然后用cat连接,最后关掉
(close)它。
最常见的工作是把一个矩阵或数据框以数字的矩形网格方式写入文件中,
而且还可能保留行列的标签。
这可以通过函数write.table 和 write 来完成。
函数write仅可以写出一个矩阵或向量的特定列(和对一个矩阵进行转置)。
函数 write.table 更为便利,它可把一个数据框(
或一个可以强制转换为数据框的对象)以包含行列标签的方式写出。
在把一个数据框写入到一个文本文件中时,有许多问题需要考虑。
大多数通过这些函数对实/复数的转换是全精度的,但是用write时,
精度由options(digits)的当前设置确定。
如果需要更多的控制,在一个数据框上逐列使用
R 倾向在首行不出现表示行名字的条目,因此
在文件里面
Greenmantle
其它一些系统需要给行名字一个条目(可能为空),此时,
可以通过在write.table 中
设置参数col.names = NA 来实现。
分隔符问题
文件中常用的字段分隔符是逗号,因为在英语语系的国家,
逗号几乎不可能出现在任何字段中。这种文件被称为
CSV(逗号分隔值)文件,对应的包装函数(wrapper function)
write.csv提供了适当的默认值。
在一些本地系统中,逗号作为十进制位中的小数点
(在write.csv函数中设置参数dec = ",")
,此时CSV文件以分号作为字段分隔符:
write.csv2 设置了适当的默认值。
用分号或制表符(sep = "\t")可能是一种
比较安全的选择。
缺损值问题
默认情况下,缺损值以 NA 形式输出,但这可以通过参数
na来改变。
注意,NaN 在write.table里面
以 NA 看待,但在cat 或
write里面是区别对待的。
被引号括起的字符串
默认情况下,字符串被引号括起(包括行列的名字)。
参数 quote 控制着字符和因子变量的引号引用问题。
需要注意字符串中的引号嵌套问题。三种
有用的形式如下
& df &- data.frame(a = I("a \" quote"))
& write.table(df)
"1" "a \" quote"
& write.table(df, qmethod = "double")
"1" "a "" quote"
& write.table(df, quote = FALSE, sep = ",")
1,a " quote
逃逸(Escape)的第二种形式常用于电子表格中。
包 MASS 中的函数 write.matrix 为写矩阵
提供了一种专用的接口。它同时提供了以区块方式写的可选项,这样
可以降低内存的使用。
用 sink 可能把标准 R 输出重定向到一个文件中,因此
捕获了 print 语句(可能是暗含的)的输出。通常,
这不是最有效的办法,options(width)设置可能需要增加。
包 foreign里面的函数 write.foreign 用
write.table 产生文本文件,同时编写一个
可以让另外一个统计包读入该文本文件的代码文件。现在支持
导出到 SPSS 和 Stata。
Previous:&,
1.3 XML 文件
当从一个文本文件中读取数据时,用户有责任知道并且按习惯创建文件,比如,
在导出问文本文件()一节中提到的
注释字符,是否有信息头行,分隔符,缺损值的描述方式(等等)。
标签语言既可以描述内容又可以定义内容的结构,这样可以使一个文件
的内容自我明了。此时,不需要为读取这些数据的软件专门提供这些
细节信息。
可扩展标签语言(eXtensible Markup Language)& 通常简化为 XML
& 可用于提供这样的结构,不仅能描述标准数据集也可以描述更复杂的数据结构。
XML 现在变得非常流行,并且作为常规数据标签和交换的标准。
它被各种团体所采用,从地理数据(如地图),图像展示
到数学等。
包 XML 为在 R 和 S-PLUS 读写XML文档提供了
通用的工具。它让我们可以很容易的使用这种近年出现的技术。
多位研究人员正在探索如何在其它事情中用 XML
描述在不同应用软件中共享的数据集;存储不同系统共享的
R 和 S-PLUS 对象;通过 SVG (可扩展矢量图,
Scalable Vector Graphics,XML 的一种针对矢量图应用的变种)
描述图像;描述函数文档;生成&生动的&含有文本,
数据和代码的分析/报告。
对 XML 包里面工具的描述已经超出本文档内容范围:
详细信息和例子见该包的主页()。
CRAN里面的包
StatDataML 是基于XML包的一个例子。
Previous:&,
2 电子表格类似的数据
read.table的变化样式
固定宽度格式的文件
数据交换格式(DIF)
直接使用scan函数
无格式列联表
在导出为文本文件()一节,我们可以看到
电子表格类似的文本文件有一系列的变化样式。在这些样式中,数据以矩形
格子状呈现,而且还可能包括行列标签。在本节,我们考虑
把这种文件导入 R。
Previous:&,
2.1 read.table 的变化样式
函数 read.table 是读取矩形格子状数据最为便利的方式。因为实际可能
遇到的情况比较多,所以预设了一些函数。这些函数调用了 read.table
但改变了它的一些默认参数。
注意,read.table 不是一种有效地读大数值矩阵的方法:
见下面的 scan 函数。
一些需要考虑到问题是:
如果文件中包含非-ASCII字符字段,要确保以正确的编码方式读取。
这是在UTF-8的本地系统里面读取Latin-1文件的一个主要问题。
此时,可以如下处理
read.table(file("file.dat", encoding="latin1"))
注意,这在任何可以呈现Latin-1名字的本地系统里面运行。
我们建议你明确地设定 header 参数。按照惯例,首行只有对应列的字段而
没有行标签对应的字段。因此,它会比余下的行少一个字段。
(如果需要在 R 里面看到这一行,设置 header = TRUE。)
如果要读取的文件里面有行标签的头字段(可能是空的),
以下面的方式读取
read.table("file.dat", header = TRUE, row.names = 1)
列名字可以通过 col.names 显式地设定;
显式设定的名字会替换首行里面的列名字(如果存在的话)。
分隔符问题
通常,打开文件看一下就可以确定文件所使用的字段分隔符,
但对于空白分割的文件,可以选择默认的sep = "" (
它能使用任何空白符作为分隔符,比如空格,制表符,换行符),
sep = " " 或者 sep = "\t"。
注意,分隔符的选择会影响输入的被引用的字符串。
如果你有含有空字段的制表符分割的文件,
一定要使用
sep = "\t"。
默认情况下,字符串可以被 " 或
' 括起,并且两种情况下,引号内部的字符都作为
字符串的一部分。有效的引用字符(可能没有)的设置由
参数 quote 控制。对于sep = "\n",
默认值改为 quote = ""。
如果没有设定分隔字符,在被引号括起的字符串里面,引号需要用
C格式的逃逸方式逃逸,即在引号前面直接加反斜杠 \。
如果设定了分隔符,在被引号括起的字符串里面,按照电子表格的习惯,
把引号重复两次以达到逃逸的效果。例如
'One string isn''t two',"one more"
可以被下面的命令读取
read.table("testfile", sep = ",")
这在默认分隔符的文件里面不起作用。
默认情况下,文件是假定用 NA 表示缺损值,
但是,这可以通过参数 na.strings 改变。
参数 na.strings 是一个可以包括一个或多个
缺损值得字符描述方式的向量。
数值列的空字段也被看作是缺损值。
在数值列,值 NaN,Inf 和 -Inf 都可以被接受的。
尾部空字段省略的行
从一个电子表格中导出的文件通常会把拖尾的空字段(包括它们的分隔符)
忽略掉。为了读取这样的文件,必须设置
参数 fill = TRUE。
字符字段中的空白
如果设定了分隔符,字符字段起始和收尾处的空白会作为字段一部分看待的。
为了去掉这些空白,可以使用参数 strip.white = TRUE。
默认情况下,read.table 忽略空白行。
这可以通过设置 blank.lines.skip = FALSE 来改变。
但这个参数只有在和 fill = TRUE 共同使用时才有效。
这时,可能是用空白行表明规则数据中的缺损样本。
变量的类型
除非你采取特别的行动,read.table 将会为数据框的每个变量
选择一个合适的类型。如果字段没有缺损以及不能直接转换,它会按
logical, integer, numeric 和 complex 的
顺序依次判断字段类型。如果所有这些类型都失败了,
变量会转变成因子。
参数 colClasses 和 as.is 提供了很大的控制权。
as.is 会 抑制字符向量转换成因子(仅仅这个功能)。
colClasses运行为输入中的每个列设置需要的类型。
注意,colClasses 和 as.is 对每 列专用,
而不是每个变量。因此,它对行标签列也同样适用(如果有的话)。
默认情况下,read.table 用 # 作为注释标识字符。
如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。
只含有空白和注释的行被当作空白行。
如果确认数据文件中没有注释内容,用
comment.char = "" 会比较安全 (也可能让速度比较快)。
许多操作系统有在文本文件中用反斜杠作为逃逸标识字符的习惯,
但是Windows系统是个例外(在路径名中使用反斜杠)。
在 R 里面,用户可以自行设定
这种习惯是否用于数据文件。
read.table 和 scan 都有一个逻辑参数 allowEscapes。
从 R 2.2.0 开始,该参数默认为否,而且反斜杠是唯一被解释为
逃逸引用符的字符(在前面描述的环境中)。如果该参数设为是,
以C形式的逃逸规则解释,也就是控制符如 \a, \b, \f, \n, \r, \t,
\v,八进制和十六进制如
\0x2A 一样描述。任何其它逃逸字符都看着是自己,包括反斜杠。
常用函数 read.csv 和 read.delim 为 read.table
设定参数以符合英语语系本地系统中电子表格导出的CSV和制表符分割的文件。
这两个函数对应的变种 read.csv2 和 read.delim2
是针对在逗号作为小数点的国家使用时设计的。
如果 read.table 的可选项设置不正确,
错误信息通常以下面的形式显示
Error in scan(file = file, what = what, sep = sep, :
line 1 did not have 5 elements
Error in read.table("files.dat", header = TRUE) :
more columns than column names
这些信息可能足以找到问题所在,但是辅助函数
count.fields 可以进一步的深入研究问题所在。
读大的数据格子(data grid)时,效率最重要。设定 comment.char = "",
以原子向量类型(逻辑型,整型,数值型,复数型,字符型或原味型)设置每列的
colClasses ,给定需要读入的行数 nrows (适当地高估一点比不设置
这个参数好)等措施会提高效率。见下面的例子
Previous:&,
2.2 固定宽度格式的文件
有时,数据文件没有字段分隔符,但在预先设定的列里面含有字段的内容。
在穿孔卡片的时代,这非常普遍。现在,有时也用来节省文件空间。
函数 read.fwf 提供了一种简单的方式来读取这样的文件。
它会制定一个向量以保存字段的宽度。该函数把文件整行地读入内存,
分割结果字符串,导出一个临时的制表符分割的文件,然后调用
read.table。这对小文件已经足够了,但对于更复杂的东西,我们
perl 一类的编程语言对文件进行预处理。
函数 read.fortran 是处理固定格式文件的一种类似的函数。它使用
Fortran格式的列规范。
Previous:&,
2.3 数据交换模式 (DIF)
曾经用于电子表格类似的数据的旧格式是DIF,即数据交换格式。
函数 read.DIF 提供了读取这种文件的简单方式。它
为每列设置类型的参数和
read.table 类似。
在Windows里面,电子表格通常在剪贴板里面以这种格式保存电子表格数据;
read.DIF("clipboard") 可以直接从剪贴板里面读取数据。
这种方法比用 read.table("clipboard") 处理含有空单元的
电子表格稳健。
Previous:&,
2.4 直接使用 scan 函数
read.table 和 read.fwf 都是先用 scan 读文件,
然后处理 scan 的结果。
它们非常便利,但有时直接使用 scan 效果
会比较好。
函数 scan 有很多参数。大多数参数在函数 read.table 里面
也存在。其中最为关键的参数是 what,它是用来指定从文件中读出
的变量的模式(mode)的列表。
如果该列表已经被命名,它的名字会被用作返回列表的分量。
模式可以是数值,字符或复数,并且常常用例子来指定,比如
"" 或 0i。例如,
cat("2 3 5 7", "11 13 17 19", file="ex.dat", sep="\n")
scan(file="ex.dat", what=list(x=0, y="", z=0), flush=TRUE)
返回一个有三个分量的列表并且丢弃
文件中的第四列。
还有一个非常有用的函数readLines。如果你想
把所有行读入 R 然后进一步处理,可以用这个便利的函数。
scan 的一个最普遍的应用是读入大的矩阵。
假定文件matrix.dat 只是包括一个 200 x 2000
的矩阵,那么我们可用
A &- matrix(scan("matrix.dat", n = 200*2000), 200, 2000, byrow = TRUE)
在一个测试里面,这花费了1秒钟(在Linux系统测试的,
同样电脑上在Windows系统下则需要3秒钟),而
A &- as.matrix(read.table("matrix.dat"))
花费了10秒钟(和更多的内存),另外,
A &- as.matrix(read.table("matrix.dat", header = FALSE, nrows = 200,
comment.char = "", colClasses = "numeric"))
花费了7秒钟。造成这种差别的原因差不多完全由于
读2000分开的短列的时间开支所致:
如果它们的长度是2000,
scan花费9秒,而
read.table 在比较高效地使用情况(特别是设定colClasses)下需要18秒;
但缺乏技巧地使用read.table时则需要125秒!
注意,时限测试依赖于读的类型和数据本事。
下面是一个读取一百万个不同整数的例子:
writeLines(as.character((1+1e6):2e6), "ints.dat")
xi &- scan("ints.dat", what=integer(0), n=1e6)
xn &- scan("ints.dat", what=numeric(0), n=1e6)
xc &- scan("ints.dat", what=character(0), n=1e6) # 0.85s
xf &- as.factor(xc)
DF &- read.table("ints.dat")
以及一百万个小集合代码的例子:
code &- c("LMH", "SJC", "CHCH", "SPC", "SOM")
writeLines(sample(code, 1e6, replace=TRUE), "code.dat")
y &- scan("code.dat", what=character(0), n=1e6)
yf &- as.factor(y)
DF &- read.table("code.dat")
DF &- read.table("code.dat", nrows=1e6)
注意,这些时限测试严重依赖操作系统
(Windows下面的基本读取所花的时间至少是Linux系统下面的两倍)和
垃圾收集器的精度。
Previous:&,
2.5 数据重塑
有时,电子表格数据以一种紧凑的格式存在。它会给出各个受试者的协变量。
而每个受试者后面跟着全部的观测值。R 的建模函数需要观测值在一列内。
考虑下面来自有重复的MRI脑测试样本数据
每个受试者有两个协变量(covariate)和最多4个测量。
该数据从Excel里面导出,文件名为 mr.csv 。
我们可以用函数 stack 来帮助操作以给出唯一
zz &- read.csv("mr.csv", strip.white = TRUE)
zzz &- cbind(zz[gl(nrow(zz), 1, 4*nrow(zz)), 1:2], stack(zz[, 3:6]))
Age values ind
函数 unstack 是相反操作的函数,
因此在导出数据时可能非常有效。
实现这个的另外一种方法是
reshape,如
& reshape(zz, idvar="id",timevar="var",
varying=list(c("V1","V2","V3","V4")),direction="long")
函数 reshape 有比stack 更为复杂的语法。但是它可以处理
比前面例子中列的数目更多的`长'格式数据。
利用 direction="wide",reshape
也可以进行相反方向的操作。
Previous:&,
2.6 无格式列联表
用数组方式展示高维列联表示很不方便的。在分类数据分析中,这种信息常常
以含有边的带行列组合的因子水平对应的单元计数的二维数组来体现。
行和列是典型的&参差&排列,因为只在它们改变时才显示标签。一个明显的习惯是,
行从顶往底部读,而列从左往右读。
在 R 里面,这种&无格式&的列联表可以用
函数 ftable 创建。
ftable 用一个适合的打印方法
创建类 "ftable" 的对象。
举个简单的例子,考虑 R 的标准数据集
UCBAdmissions。这是一个3维列联表,
用于对1973年UC Berkeley 研究生部六个最大的系
的学生申请按照入学和性别的分类。
& data(UCBAdmissions)
& ftable(UCBAdmissions)
Admitted Male
512 353 120 138
17 202 131
Rejected Male
313 207 205 279 138 351
8 391 244 299 317
这种显示方式无疑比数据的3维数组
描述方式更有用。
还有一个函数 read.ftable
用于从文件中读取无格式的列联表。
为了处理试图准确地描述行和列变量名字和水平信息的列联表变体,
这个函数还有一些其它参数。read.ftable 的帮助页面有一些
非常有用的例子。无格式列联表可以用
as.table 转换成数组格式的标准列联表。
注意,无格式列联表的特征就是行(可能还有列)标签的&参差&排列。
如果给定行变量水平的所有格子(grid),
应该使用函数 xtabs 从这种数据创建列联表,
而不是用 read.table 读取数据。
Previous:&,
3 导入其它统计软件的数据
在本章,我们研究如何读取其它统计系统生成二进制数据文件问题。
最好避免这种问题,但若没法得到原始系统的时候,这种问题
又是不可避免的。
EpiInfo Minitab SAS S-PLUS SPSS Stata Systat
Previous:&,
3.1 EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat
推荐包 foreign 提供了导入这些统计系统产生的文件,
导出 Stata或SPSS 格式数据的工具。在一些情况下,
这些函数可能 read.table 需要的内存少很多。
write.foreign (见导出到文本文件())
现在支持 SPSS 和 Stata
类型的数据导出机制。
EpiInfo 版本5和6保存的数据是自我描述的固定宽度
的文本文件。
read.epiinfo 可以读入这些 .REC 文件
到一个 R 数据框。
EpiData 也产生这种格式的数据。
函数 read.mtp 可以导入`Minitab便携式工作表'
(Minitab Portable Worksheet)文件。该函数
返回一个以工作表作为分量的 R 列表。
函数 read.xport 读入SAS传输格式(XPORT)的文件,并且返回
一个数据框的列表。如果你的系统安装了SAS,
函数 read.ssd 可用来创建和运行以传输格式保存
SAS永久数据集(.ssd 或 .sas7bdat)的SAS脚本。
它随后调用 read.xport 去读取
结果文件。包 Hmisc 有个类似的函数 sas.get,它
也是允许SAS脚本。
函数 read.S 可以读取(32位)Unix或Windows(或其它操作系统)
上由S-PLUS 3.x,4.x 或 2000 产生二进制对象。这能读取许多但不是全部的
S 对象:特别是,它只能读取向量,矩阵,数据框和含有这类数据对象的
函数 data.restore 用于读 S-PLUS 的转储数据(data dump)
(由 data.dump 创建)。它有同样的限制(除了α平台
的转储数据也可被读取)。它还可能读取来自 S-PLUS 5.x 和 6.x
通过data.dump(oldStyle=T) 写出的转储数据。
如果可以访问 S-PLUS,更可靠的方式是在 S-PLUS 里面导出
(dump)对象文件然后在 R 里面载入执行(source)
该文件。在S-PLUS 5.x 和 6.x 里面,需要用
dump(..., oldStyle=T),对于读入大对象,
优先使用用转储文件作为批量的脚本而非source。
函数 read.spss 可以读取 SPSS 里面 `save' 和
`export' 命令创建的文件。
它返回一个由被保存数据集中每个变量对应分量的列表。
含有值标签的 SPSS 变量可以选择转换为
SPSS 数据入口(Data Entry)是创建数据输入的窗体。
默认情况下,它创建一种read.spss不能处理的
含有额外格式信息的数据文件。但是,它可能以普通的
SPSS 格式导出数据。
Stata 的 .dta 文件是二进制文件格式。
函数read.dta 和 write.dta
可以读写版本 5,6,7/SE和8的Stata 文件。
有值标签的Stata变量可以选择性地转换为
R 因子(反之也行)。
函数 read.systat 可以读取 Systat
在小字节序机器(little-endian machines)(比如Windows)上保存(SAVE)的
矩形的数据文件(mtype = 1)。
这些文件的扩展名为 .sys
或 .syd (最近)。
Previous:&,
3.2 Octave
Octave 是一种线性代数的数值运算系统(),
来自包 foreign 的 函数 read.octave
可以读入 Octave 用命令 save -ascii 创建的文本数据格式。
该格式支持变量的大多数通用类型,包括标准的原子型(实和复标量/矩阵,
和N维数组,字符串,极差(range),和布尔值标量/矩阵)和
递归式(结构体(structs),单元(cells)和列表)。
Previous:&,
4 关系数据库
为什么使用数据库?
对RDBMs的回顾
R 的接口包
Previous:&,
4.1 为什么使用数据库?
R 可以很好处理的数据类型是有限的。既然所有R 处理的数据都放在
内存中,并且在一个函数的执行过程中会创建一个数据集的多个拷贝,
因此R不适合处理很大的数据集。
大于一百兆(或少一点)的数据对象会导致
R的内存溢出。
R 不容易支持并发访问数据。也就是说,如果多于一个用户在访问
或者更新同一个数据,一个用户的修改对另外一个用户是不可见的。
R 支持数据的永久性,因为用户需要从一个回话中保存
数据对象或整个工作表而在随后的会话中再次保存。
但被保存数据的格式对 R 是特有的,在其它系统里面不是
那么容易被处理。
数据库管理系统(Database Management Systems,DBMSs)和,特别是,
关系数据库管理系统(RDBMSs)是为了更好地做这些事情而设计。.
它们加强的地方在于
提供对大型数据库中被选择部分的快速访问。
强大的针对数据库的列进行汇总和交叉列表(cross-tabulate)的功能。
以更有条理的方式存储数据。这比电子表和R的数据框
的矩形网格格式更容易组织。
支持运行于不同主机上面的客户端的并发访问,同时
加强数据访问的安全性限制。
有能力作为一个服务很多客户端的服务器。
DBMS可能要用到的统计应用的类型是从数据中
提取1%的样本,对数据交差列表(cross-tabulate)以产生一个
多维的列联表,和为单独的分析从数据库中提取数据组。
Previous:&,
4.2 对RDBMs的回顾
已经有很多大型的(也是很贵的)商业的关系数据库管理系统(
; ; ; IBM的 DB/2;Microsoft运行在Windows系统上的
SQL Server)和学术的小型系统的数据(如 MySQL,PostgreSQL,
Microsoft Access,...)。前者都会强调数据安全性特征。
但是界限是很模糊的,比如开源的PostgreSQL有越来越多的高端特性
以及`免费'的Informix,Oracle和Sysbase在Linux系统下面都可以
还有其它常常使用的数据源,包括电子表格,
非关系型数据库,甚至文本文件(可能已经压缩过的)。
开放数据库互连(Open Database Connectivity,简写为 ODBC)
是使用所有这些数据源的标准。它源于 Windows系统
(见),但Linux/Unix系统
也实现这个标准。
本章后面描述的所有包都提供了客户端/服务器数据库的客户端。
数据库可以放置在一样的机器上或远程(这更常见)。
数据库交互时有一个 ISO 标准(事实上有好多种:
SQL92 就是 ISO/IEC 9075,也被称为
ANSI X3.135-1992,此外 SQL99 也逐步被使用了)的
的交互语言SQL (结构化查询语言,Structured Query Language,
有时读作`sequel':见 Bowman et al. 1996 以及 Kline
和 Kline 2001)。不同的DBMSs对这个标准都是在一定程度上支持。
Previous:&,
4.2.1 SQL 查询
对于常规操作,非常全面的 R 接口可以产生SQL,但是对于复杂
操作,只有直接使用 SQL。
习惯上,SQL 用大写字母编写,
但是很多用户发现在 R 接口函数里面用
小写比较方便。
一个关系型DBMS以 表格(tables) (或
关系(relations))数据库的方式存储数据。数据库的表格
和 R 的数据框类似,因为它们都是由同一类型(数值,字符,日期,货币,...)的
列(column)或者
字段(fields)
和 包含实体观测数据的 行(row)或
记录(record)组成。
SQL `查询'是关系数据库里面最常用的操作。
典型的查询是下面类型的SELECT语句
SELECT State, Murder FROM USArrests WHERE Rape & 30 ORDER BY Murder
SELECT t.sch, c.meanses, t.sex, t.achieve
FROM student as t, school as c WHERE t.sch = c.id
SELECT sex, COUNT(*) FROM student GROUP BY sex
SELECT sch, AVG(sestat) FROM student GROUP BY sch LIMIT 10
上面语句的第一条从已经复制到一个数据库表的
R 数据框USArrests 数据中选择两列,
基于第三列做子集操作,并且让结果数据排序。
第二条语句连接(join)两个表格
student 和
school,随后返回四列。第三和第四个查询
进行了一些交差列表操作然后返回计数和平均值。
(五个聚合函数分别是COUNT(*) 以及用于列的 SUM, MAX, MIN 和 AVG)
SELECT查询用FROM选择表,WHERE设定查询条件(或者被AND或OR
分割的多个条件),然后用ORDER BY对结果进行排序。
和数据框不一样的是,RDBMS表里面的行最好看作是无序的,
如果没有ORDER BY语句,顺序是不确定的。
你可以对对不止一列进行排序(辞典排序方式),
各个列间用逗号分隔。
把DESC放在ORDER BY后面会让结果按降序排列。
SELECT DISTINCT 查询只返回被选中的表中
不同的行。
GROUP BY字句选择基于标准的行的子集。
如果不止一列被设定(逗号分隔),可以用五个聚合函数
中的一个对多维交差分类的数据进行汇总。
HAVING字句可以基于聚合值选择或去掉一些组。
如果SELECT语句含有产生唯一排序的ORDER BY语句,
LIMIT字句可加入选择(通过数字)输出行的一个连续的区块。
在同时取得一个区块行时,该语句非常有用。
(除非排序是唯一的否则它可能不可靠,因为LIMIT字句
可用来优化查询。)
还有查询用于创建表(CREATE TABLE,但通常是利用这些接口
把一个数据框复制到数据库),INSERT(插入)或DELETE(删除)
或UPDATE(更新)数据。可用 DROP TABLE `查询'破坏一个表
Kline 和 Kline (2001) 对SQL Server 2000,Oracle,MySQL 和 PostgreSQL
里面SQL语句的实现细节进行了论述。
Previous:&,
4.2.2 数据类型
数据可用任何一种数据类型保存在数据库里面。数据类型的范围
是依赖于DBMS,但是 SQL 标准定义了许多类型,包括下面广泛
实现的类型(不一定采用 SQL 的名字)。
float(p)实数,精度可选。常常被称着 real 或
double 或 double precision。
integer32位整数。常常称为 int。
smallint16位整数
character(n)固定长度的字符串。常常称为 char。
character varying(n)可变长度的字符串。常常称为 varchar。
几乎总有一个上限 255 个字符串。
booleantrue 或者 false。有时被称为
bool 或 bit。
date历法日期
time当前时间
timestamp日期和时间
因为时区(with
timezone)的缘故,time 和 timestamp有很多变种。
其它广泛实现类型是用保存大块头的文本和二进制数据的
全面实现的R 接口包为用户掩藏了很多
类型转换的问题。
Previous:&,
4.3 R 的接口包
CRAN 已经有几个帮助 R 连接 DBMS 的包。
它们提供了不同层次上的抽象。
一些包为整个数据框和数据库间的数据复制提供方法。
所有的包都提供了通过SQL 查询从数据库里面
选择数据,以数据框获得全部结果数据或者部分(通常是行
的组)的功能。
除 RODBC 外的所有包都是连到一个DBMS。统一`前端'包DBI
()和`后端'开发最完善的
包RMySQL的工作现在正在进行。
同样在CRAN,还有后端包ROracle 和 RSQLite
(该项目和 SQLite 数据库管理系统同时在开发,
两个早期的包 RmSQL 和 RPgSQL 现在已经不再支持,
已经属于 CRAN 的开发范围:BioConductor项目有包 RdbiPgSQL。
PL/R ()是一个把 R 嵌入
PostgreSQL 的项目。
DBI / RMySQL
Previous:&,
4.3.1 包 DBI 和
CRAN 的包 RMySQL 提供了MySQL数据库系统的接口(见
和 Dubois,2000)。
这里的描述用于版本 0.5-0:早期版本有很多不一样的接口。
当前版本需要 DBI,这里的描述通过少量修改也可用于其它
支持DBI包的后端。
MySQL存在于 Unix/Linux 和 Windows 上面:从3.23.x版本开始(2001年1月),
它以GPL协议发布。MySQL是一个`轻量级'(light and lean)的数据库。
(在大小写敏感的文件操作系统,它支持名字的大小写。注意,Windows系统里面文件名大小写
不敏感。)
包RMySQL在Linux和Windows系统上都可以使用。
dbDriver("MySQL") 的调用会返回一个数据库连接管理对象,然后
调用dbConnect打开一个数据库连接,随后会调用泛型函数
dbDisconnect 来关闭这个连接。
对于,ORACLE和SQLITE系统,分别使用ROracle 或 RSQLite
里面的dbDriver("Oracle") 函数或 dbDriver("SQLite")
SQL 查询可以通过dbSendQuery或
dbGetQuery 传给数据库管理系统。dbGetQuery 传送查询语句,
把结果以数据框形式返回。dbSendQuery 传送查询,返回的结果是
继承"DBIResult"的一个子类的对象。"DBIResult" 类
可用于取得结果,而且还可以通过调用 dbClearResult
清除结果。
函数 fetch 用于获得查询结果的部分或全部行,并以列表返回。
函数 dbHasCompleted 确定是否所有行已经获得了,
而 dbGetRowCount 返回结果中行的数目。
这些是数据库中读/写/测试/删除表的方便接口。
dbReadTable 和 dbWriteTable
实现一个 R 数据框的复制进和复制出数据库,
把数据框的行名字映射到 MySQL 表的
row_names 字段。
& library(RMySQL) # will load DBI as well
## 打开一个MySQL数据库的连接
& con &- dbConnect(dbDriver("MySQL"), dbname = "test")
## 列出数据库中表
& dbListTables(con)
## 把一个数据框导入到数据库,删除任何已经存在的拷贝
& data(USArrests)
& dbWriteTable(con, "arrests", USArrests, overwrite = TRUE)
& dbListTables(con)
[1] "arrests"
## 获得整个表
& dbReadTable(con, "arrests")
Murder Assault UrbanPop Rape
## 从导入的表中查询
& dbGetQuery(con, paste("select row_names, Murder from arrests",
"where Rape & 30 order by Murder"))
row_names Murder
3 California
5 New Mexico
& dbRemoveTable(con, "arrests")
& dbDisconnect(con)
Previous:&,
4.3.2 包 RODBC
CRAN 里面的包 RODBC 提供了支持 ODBC 规范的
访问数据源的接口。它有广泛的需求,可以使一样的 R 代码访问不同的
数据库系统。
在Unix/Linux以及Windows系统都能运行包 RODBC,而且几乎
所有的数据库系统都支持ODBC。我们已经在
Windows 平台上的Microsoft SQL Server,Access,MySQL 和 PostgreSQL
以及Linux平台上的MySQL,Oracle,PostgreSQL和SQLite都测试过了。
ODBC是一种客户端-服务器系统。我们可以从Windows客户端
连接Unix服务器上运行的DBMS,反之也然。
Windows 通常都会支持ODBC,最新版本作为MDAC的一部分可以从
在Unix/Linux系统,你需要一个 ODBC 驱动管理,比如
unixODBC () 或 iOBDC
(),还需要为你的数据库系统
安装一个驱动。FreeODBC 项目
ODBC 信息相关的一个知识库。
Windows不仅为DBMSs提供驱动,
还为Excel电子表格(.xls),DBase(.dbf)文件甚至文本文件
提供驱动。(不需要安装命名过的软件。)现在已经有Excel 2007和Access
2007版本的驱动了(去,选择`Office'并且
找到`ODBC',然后下载AccessDatabaseEngine.exe)。
大量同时访问是可能的。调用 odbcConnect 或 odbcDriverConnect
(在Windows图形化界面下,可以通过对话框选择数据库)
可以打开一个连接,返回一个用于随后数据库访问的控制(handle)。
打印一个连接会给出ODBC连接的一些细节,而调用
odbcGetInfo 会给出客户端和服务器的一些细节信息。
连接可以通过调用函数 close 或 odbcClose 来关闭。
没有 R 对象对应或不在 R 会话后面的连接也可以调用这两个函数来关闭,
但会有警告信息。
在一个连接中的表的细节信息可以通过函数
sqlTables 获得。
函数 sqlSave 会把 R 数据框复制到一个数据库的表中,
而函数 sqlFetch 会把一个数据库中的表拷贝到
一个 R 的数据框中。
一个 SQL 查询可以通过调用sqlQuery 传给
数据库。返回的结果是 R 的数据框。(sqlCopy把一个
查询传给数据库,返回结果在数据库中以表的方式保存。)
一种比较好的控制方式是首先调用 odbcQuery, 然后
用 sqlGetResults 取得结果。后者可用于一个循环中
每次获得有限行,就如函数 sqlFetchMore 的功能。
这里是用PostgreSQL的一个例子,其中ODBC 驱动
把列和数据框的名字映射成小写。我们用一个事先创建的数据库
testdb,还有一个个设置在unixODBC下文件 ~/.odbc.ini
的数据源名字(Data Source Name,DSN)。同样的代码在MyODBC访问Linux
或Windows上的MySQL数据库时一样有效(其中,MySQL依然会把名字
映射成小写)。在 Windows,DSN在控制面板的
ODBC 工具里面设置(在Windows
2000/XP,设置`管理工具'部分的`数据源(ODBC)')。
& library(RODBC)
## 让函数把名字映射成小写
& channel &- odbcConnect("testdb", uid="ripley", case="tolower")
## 把一个数据框导入数据库
& data(USArrests)
& sqlSave(channel, USArrests, rownames = "state", addPK = TRUE)
& rm(USArrests)
## 列出数据库的表
& sqlTables(channel)
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS
## 列出表格
& sqlFetch(channel, "USArrests", rownames = "state")
murder assault urbanpop rape
## SQL查询,原先是在一行的
& sqlQuery(channel, "select state, murder from USArrests
where rape & 30 order by murder")
state murder
1 Colorado
3 California
5 New Mexico
6 Michigan
& sqlDrop(channel, "USArrests")
## 关闭连接
& odbcClose(channel)
作为 Windows下面用 ODBC 连接 Excel电子表格的一个简单例子,
我们可以如下读取电子表格
& library(RODBC)
& channel &- odbcConnectExcel("bdr.xls")
## 列出电子表格
& sqlTables(channel)
TABLE_CAT TABLE_SCHEM
TABLE_NAME
TABLE_TYPE REMARKS
Sheet1$ SYSTEM TABLE
Sheet2$ SYSTEM TABLE
Sheet3$ SYSTEM TABLE
NA Sheet1$Print_Area
## 获得表单1的内容,可以用下面任何一种方式
& sh1 &- sqlFetch(channel, "Sheet1")
& sh1 &- sqlQuery(channel, "select * from [Sheet1$]")
注意,数据库表的规范和 sqlTables 返回的名字是不一样的:
sqlFetch 可以映射这种差异。
library(RPgSQL) -->
db.connect(dbname="testdb")
# add authentication as needed -->
data(USArrests) -->
names(usarrests)
db.write.table(USArrests, write.row.names = TRUE) -->
db.write.table(usarrests, write.row.names = TRUE) -->
rm(USArrests, usarrests) -->
db.ls() -->
db.read.table("USArrests") -->
bind.db.proxy("USArrests") -->
USArrests[, "Rape"] -->
rm(USArrests) # remove proxy -->
db.execute("SELECT rpgsql_row_names, murder FROM usarrests", -->
db.fetch.result() -->
db.rm("USArrests", "usarrests") # use ask=FALSE to skip confirmation -->
db.ls() -->
db.disconnect() -->
Previous:&,
5 二进制文件
二进制数据格式
DBase文件(DBF)
二进制连接()是现在首选的
处理二进制文件的方法。
Previous:&,
5.1 Binary data formats 二进制数据格式
包 hdf5,RNetCDF 和 ncdf 为 NASA
的 HDF5 (层次数据格式,Hierarchical Data Format,
见 )和 UCAR的 netCDF 数据文件
(网络公共数据格式,network Common Data Form,见
)提供了接口。
二者都是用面向数组的方式存储科学数据的系统,包括
描述,标签,格式,单位,...。HDF5允许
成组的数组,因此R的接口会把列表
映射成HDF5的组,并且可以写数值和字符向量/矩阵。
CRAN 里面的包ncvar 通过
包RNetCDF 为netCDF数据文件提供高水平的
还有一个来自
的包 rhdf5。
Previous:&,
5.2 dBase 文件(DBF)
dBase 是 Ashton-Tate 写的一个DOS程序,随后被
Borland拥有。它有一种很流行的二进制无格式文件,以
.dbf作为扩展名。它被 'Xbase' 家族的数据库
(包括dBase,Clipper,FoxPro和它们的Windows的对应物
Visual dBase,Visual Objects和Visual FoxPro,见
)广泛采用。
dBase文件含有一个信息头,随后是一系列字段,
因此和 R 的数据框非常类似。
数据本身以文本格式保存,可以包括
字符,逻辑和数值字段,和以后版本的其它类型
函数 read.dbf 和 write.dbf 提供了在
所有 R 平台上读和写基本DBF文件的途径。
RODBC 包里面的函数 odbcConnectDbase
通过Microsoft的dBase ODBC驱动为Windows用户
提供了更为全面的工具读取DBF文件(Visual FoxPro驱动可以
通过odbcDriverConnect 使用)。
Previous:&,
连接(Connections)在 R 里面的使用是基于Chambers (1998)的建议。
它是用一组函数去实现灵活的指向类似文件对象的接口代替文件名的使用。
输出到连接
从连接输入
列出和操作连接
二进制连接
Previous:&,
6.1 连接类型
最熟悉的连接类型是文件,而文件连接由函数file创建。
文件连接打开后可以在文本或二进制模式下读写添加文本(
如果操作系统允许的话)。
事实上,文件可以为读和写同时打开,并且
R 为读和写保持分离的文件位置。
注意,一个连接创建后默认不是打开的。
基本原则是使用连接的函数在连接还没有打开时
需要打开一个连接(必须的),并且如果它打开了一个连接
在使用后需要关闭它。简单来说,让连接处于你发现它时的状态。
有泛型函数open 和
close 的方法去显式地打开或关闭连接。
gzip 算法压缩的文件可以通过函数 gzfile
创建连接,而bzip2 算法压缩的文件通过
bzfile 创建连接。
Unix程序员习惯用 stdin,
stdout 和 stderr 处理特定的文件。
这些以 终端连接(Terminal Connection)的
形式在R里面存在。它们可能是通常的文件,但是它们还可能
指向从图形化控制台输入或输出的内容。(尽管使用标准的Unix
R 接口,stdin 使用通过 readline 提交的行
而不是一个文件。)
这三个终端连接总是打开的,并且不能再打开或关闭。
stdout 和 stderr 习惯用于
正常输出(标准输出流)和错误信息的输出(标准错误流)。
它们可能输出到同一个地方,但是尽管正常输出可以通过
调用函数 sink 实现重定向,传送给stderr的
错误信息输出必须使用 sink, type="message")。
需要特别注意这里使用的语句:连接不能重定向,但输出可以
发送给其它连接。
文本连接(Text connections)是另外一种输入源。
它们允许 R 读入的字符向量就像从文本文件中读入的行。
可用调用textConnection 来创建和打开文本连接。
函数 textConnection 在创建文本连接的时候把
字符向量的当前内容复制到内部缓存里面。
文本连接可以用来捕获R输出到一个字符向量中。
textConnection 也能用来
在用户的工作空间创建一个新的字符对象或者
添加到一个已有的对象后面。
通过调用 textConnection 打开连接,
并且任何时候输出到连接的全部行都可以
从 R 对象获得。关闭连接时会把所有余下的输出
写入到字符向量的最后一个元素。
管道(Pipes)是连接到其它进程的文件的一种特有形式,
管道连接通过函数pipe 创建。
为写而打开一个管道连接(在管道后面添加内容是没有意义的)时,
首先运行一个操作系统命令,然后把标准输出和R连接,
最后把内容写入到那个管道。相反,为输入打开一个管道连接,
也是运行一个操作系统命令,然后让它的标准输出作为R
从那个连接获得的输入。
URL 类型的 http://,ftp:// 和 file://
可以通过函数 url 读内容。为方便起见,file 也可以
接受这种文件规范和调用url。
套接字(Sockets)在支持Berkeley类型的套接字系统
(大部分Unix系统,Linux和Windows)上可以通过
函数socketConnection 创建连接。套接字可以写入也可以读入,
并且客户端和服务器端的套接字都可以使用。
Previous:&,
6.2 输出到连接
我们已经描述过函数 cat,write,write.table
和 sink 的写入文件的功能,特别是参数append = TRUE时,
在一个文件末尾添加内容的功能。这些也是这些函数在 R 1.2.0之前的
这些函数当前功能的体现和以前是一样的,但是实际发生的是,
当 file 参数是一个字符串时,打开文件连接(写入或者添加)和
函数调用后再次关闭连接。
如果我们想重复性地写入到同样的文件中,
显式地声明和打开一个连接,把这个连接对象传递给
一个输出函数是比较有效的。这使得写入到一个管道
成为一种可能。在早期的版本中,通过语法 file = "|cmd"
已经部分实现(现在还在使用)。
还有一个函数 writeLines 用于把全部的文本行
写入到一个连接。
一些简单的例子如下
zz &- file("ex.data", "w")
# 打开一个输出文件连接
cat("TITLE extra line", "2 3 5 7", "", "11 13 17",
file = zz, sep = "\n")
cat("One more line\n", file = zz)
## 使用管道(Unix)在输出中把小数点转换成逗号
## R字符串和(可能)SHELL脚本中都需要把 \ 写两次
zz &- pipe(paste("sed s/\\\\./,/ &", "outfile"), "w")
cat(format(round(rnorm(100), 4)), sep = "\n", file = zz)
## 现在查看输出文件:
file.show("outfile", delete.file = TRUE)
## 捕获R输出:使用 help(lm) 里面的例子
zz &- textConnection("ex.lm.out", "w")
example(lm, prompt.echo = "& ")
## 现在 `ex.lm.out' 含有需要进一步处理的输出内容
## 查看里面的内容,如
cat(ex.lm.out, sep = "\n")
Previous:&,
6.3 从连接输入
从连接读入数据的基本函数是scan 和
readLines。这些函数有个以字符串作为输入的参数,在
函数调用时会打开一个文件连接,但显式地打开文件连接允许一个文件
可以连续地以不同格式读入。
调用 scan 的其它函数也可以使用连接,
特别是 read.table。
一些简单的例子如下
## 读入前面例子中创建的文件
readLines("ex.data")
unlink("ex.data")
## 读入当前目录的清单(Unix)
readLines(pipe("ls -1"))
# 从输入文件中去掉拖尾的逗号。
# 假定我们有一个包含如下`数据'的文件
450, 390, 467, 654,
30, 542, 334, 432, 421,
357, 497, 493, 550, 549, 467, 575, 578, 342,
446, 547, 534, 495, 979, 479
# 然后通过如下命令读入
scan(pipe("sed -e s/,$// data"), sep=",")
为方便起见,如果 file 的参数指定的是FTP或HTTP URL,
则该 URL 会通过函数 url 打开读入内容。
通过file://foo.bar指定文件也是允许的。
Previous:&,
6.3.1 压栈
C程序员可能对 ungetc 函数非常熟悉。这个函数会把一个字符退回到
文本输入流中。R 连接以一种更为强大的方式实现一样的想法,函数
pushBack 可以把任意行的文本(本质上)压入给连接。
压栈操作类似堆栈,因此一个读请求首先使用从最近压入的文本行,
然后才是早期压入的行,最后读连接自己。
一旦一个压入行已经读完,它会被清除掉。通过函数 pushBackLength
可以查看处理中的压入行当数目。
下面是一个简单的例子
& zz &- textConnection(LETTERS)
& readLines(zz, 2)
[1] "A" "B"
& scan(zz, "", 4)
Read 4 items
[1] "C" "D" "E" "F"
& pushBack(c("aa", "bb"), zz)
& scan(zz, "", 4)
Read 4 items
[1] "aa" "bb" "G"
& close(zz)
压栈操作仅适用于文本输入模式的连接。
Previous:&,
6.4 列出和操作连接
通过函数 showConnections() 可以汇总当前用户打开的连接。
通过函数 showConnections(all
= TRUE) 则可以查看所有连接的汇总信息,包括已经关闭或终止的连接。
泛型函数 seek 用于读和(在一些连接里)
重新设置读或写的当前位置。不幸的是,它依赖于操作系统,
因此可能不太可靠(如,在Windows下面处理文本文件)。
函数 isSeekable 判断 seek 是否可以修改
由参数设定的连接的位置。
函数 truncate 可用于截去为在当前位置写而打开的文件。
它仅用于 file 连接,并且不是在所有平台都可以用。
Previous:&,
6.5 二进制连接
函数 readBin 和 writeBin 可以读写二进制连接。
二进制模式打开的连接可以通过添加 "b" 的方式设置
读写规范,即用 "rb"
表示读,"wb" 或 "ab"
(如果可以的话)表示写。这些函数拥有的参数如下
readBin(con, what, n = 1, size = NA, endian = .Platform$endian)
writeBin(object, con, size = NA, endian = .Platform$endian)
在两种情况下,con 是一个在函数调用过程中因需要而打开的
连接,如果给定的是字符串,它会被假定是文件名字。
描述输出略微简单一点,因此我们首先描述它。
object 必须是一个原子型向量对象,也就是没有属性的
numeric,integer,logical,character,
complex 或 raw 模式的向量。默认情况下,这些以
和内存里面完全一样字节流的写入文件的。
readBin 从文件中读入字节流,把它们解释为 what 给定
模式的向量。这既可以是一个适当模式(比如,what=integer())的
对象,也可以是字符串所描述的模式(前面章节给出的五种模式中的一种,
或"double" 或 "int")的对象。参数 n 指定
从连接中读入向量元素的最大数目:
如果可以获得的元素比较少,会返回一个短的向量。
参数signed允许单字节和双字节整数
作为有符号(默认)或无符号整数读入。
剩下的两个参数用于和其它程序或平台交换数据而读写数据。
默认情况下,二进制数据直接从内存传给连接,反之亦然。
在不同体系架构的机器间传输文件时,这两个参数是不够的,但是,
几乎所有的R平台之间仅仅需要改变字节序(byte-order)。
普通PC(基于ix86 和 x86_64 的机器),Compaq Alpha和
Vaxen 是小字节序(little-endian)的,Sun Sparc,mc680x0 系列,IBM
R6000, Apple Macintosh, SGI 和许多其它电脑都是 大字节序(big-endian)
的。(网络字节序(如XDR)是大字节序的。)
转换来自其它程序的数据,我们可能需要做更多的事情,比如,读16位的整数
或写单精度的实数。
这可以通过 size 参数来做。这个参数(通常)允许整数
和逻辑值的存储大小为1,2,4,8,允许实数存储大小为4,8和12或16(可能的话)。
在不同存储大小之间转换可能会丢失很多精度,
并且不能用于含 NA 的向量。
字符串以C格式读写,这是一个以零字节结束的字节流。
函数 readChar 和
writeChar 提供了更大的灵活性。
Previous:&,
6.5.1 特殊值
函数 readBin 和 writeBin 可以传递缺损和特殊值。
在需要修改存储尺寸时,最好不要传输这类特殊值。
R 的逻辑和整型缺损值是 INT_MIN,
它是 C 头文件 limits.h 里面表示 int 最小的值,
通常对应着位模式 0x。
R 的数值和复数类型的特殊值得表示是机器依耐的,还可能是编译器依耐的。
使用它们的最简单的方法是连到一个外部程序,而不是连到用于输出
双精度恒量 NA_REAL,R_PosInf 和 R_NegInf以及包含
定义了宏 ISNAN 和 R_FINITE 的头文件 Rmath.h
的Rmath 包。
如果这不能办到,在所有公共的平台上,IEC 60559 (也就是 IEEE
754)算法都可以被采用。因此,标准的C工具可以用来测试或设置
值 Inf,-Inf 和 NaN。
在这些平台上,NA 用 NaN 表示,值为
0x7a2 (就是十进制里面的1954)。
字符缺损值写作 NA,并且没有专门的措施识别
识别作为缺损值的字符值(因为这一步可以在读取它们后
再次赋值的时候判断)。
Previous:&,
7 网络接口
从套接字读取
使用 download.file
CORBA 接口
在网络连接的底层水平上交换数据,
R 提供的功能非常有限。
Previous:&,
7.1 从套接字读取
基本的 R 平台提供一些工具通过BSD套接字
让那些支持它们的系统(包括通常的Linux,Unix
和Windows系统上的 R 端口)进行通信。
使用套接字的一个潜在问题是这些工具通常因为安全原因被阻塞
或强迫使用网页缓存。因此,这些功能可能在局域网比外部网有用。
对于新项目,建议使用套接字连接代替直接使用套接字。
早期的底层接口通过函数 make.socket,
read.socket,write.socket 和 close.socket
来实现的。
Previous:&,
7.2 使用 download.file
函数 download.file 通过FTP或HTT读取来自网络资源的文件,然后
写入到一个文件中。通常这一步可以避免的,因为函数如 read.table 和
scan 都可以直接从一个URL读取内容,它们要么显式地用 url
打开一个连接,要么暗含地给 file 参数设定一个URL。
Previous:&,
7.3 DCOM 接口
DCOM 是 Windows 用于可能在不同机器上的不同程序间
通讯的一种协议。
从CRAN 的 Software-&Other-&Non-standard 下面
可以获得的 Thomas Baier 开发的
StatConnector 程序提供了一个连到
R 的Windows版本配套的代理DLL的接口,同时创建一个
DCOM 服务器。
这可用于和 R 交换简单对象(向量和矩阵)
以及把命令发送给 R。
这个程序有一个 Visual Basic 的演示程序以及 Erich Neuwirth
开发的一个Excel插件。这个接口处于另外一个方向和这里考虑的不一样,
即其它应用软件作为客户端(Excel,或用Visual Basic写的),
而R 作为服务器。
另外一个 (D)COM 服务器可以从
这种服务器允许R对象以COM值输出。那个网站还有包
RDCOMClient 和 SWinTypeLibs,它们允许 R
作为一个(D)COM客户端。
Previous:&,
7.4 CORBA 接口
CORBA (通用对象请求代理体系结构,
Common Object Request Broker Architecture)
和 DCOM 类似,允许应用程序调用方法或操作,服务器端运行
在其它程序里面的对象。这些应用程序还可能用不同的语言编写,
还运行在不同的机器上。
Omegahat 项目()中
有个 CORBA 包,目前为Unix设计。但是Windows版本的也是
有可能设计的。
这个包允许 R 命令用于查找可以获得的 CORBA 服务器
的地址,查询它们提供的方法,并且动态地在这些对象里调用方法。
在这些调用里,作为参数的 R 值在调用时输出,在操作执行时获得。
原始数据类型(向量和列表)默认是输出的,但更为复杂的对象通过
引用导出。这样使用的例子包括和 Gnumeric
()电子表格通讯,以及和数据
可视化系统
配合使用。
用户可以在 R 里面创建 CORBA 服务器,允许
其它应用程序调用这些方法。例如,用户可能提供对特别的数据集
或一些 R 建模软件的访问。通过联合 R 数据对象和函数,
这些可以动态实现。这样允许用户显式地从 R 里面导出
数据和函数。
用户还可以用CORBA在R里面实现分布式的并行运算。
一个 R 会话作为一个管理器,同时向运行在其它 R 工作会话
上的不同服务器分发任务。这是因为 R 里面实现了
CORBA调用的异步和后台调用。
更多的信息可以从 Omegahat
项目()获得。
Previous:&,
8 读取Excel电子表格
最常见的R数据导入/导出问题可能是`我如何读一个Excel电子表格'。
本章汇总了早先给出的建议和可选方案。
注意,大多数建议都是基于Excel 2007 以前版本的
Excel 电子表格:现在只有一种方法可以读取
.xlsx格式的文件,就是通过 RODBC。
第一个建议就是尽量避免这样做!如果你可以访问Excel,把你的Excel数据
用制表符分隔或逗号分隔的格式导出,然后用 read.delim 或
read.csv 导入R。
(在采用逗号作为小数点的欧洲大陆本地系统里面,你可能需要用
read.delim2 或
read.csv2。)
导出一个DIF文件然后用read.DIF
读入是另外一种可能性。
如果你没有Excel,还有许多其它软件可以用来读这种
电子表格然后导出为文本格式,无论在Windows还是Unix系统。
例如,Gnumeric ()和
OpenOffice ()。你还可以
在这些软件里面展示的电子表格和R之间用剪切-粘帖功能:
read.table 能从 R 控制台读入 或者在Windows里面,从
剪贴板(通过file = "clipboard"或readClipboard)。
read.DIF 也能从剪贴板读入。
注意,Excel 文件 .xls 不仅仅是一个电子表格:这种文件可能会含有
很多电子表格,而且这些表单能包含公式,宏等等。
不是所有的读者都可以看到第一个表单外的其它表单,并且可能
对文件的其它内容比较困惑。
Windows用户可以用包
RODBC 里面的odbcConnectExcel 。
这可以选择Excel电子表格中的任何一个电子表格的行和列。
odbcConnectExcel2007可以读Excel 2007 格式和早期的版本
(假定安装了最新的驱动:见前面的内容)。
也是只用于Windows系统,包 xlsReadWrite 有一个函数
read.xls 来读.xls文件(基于第三方的
非开源的Delphi组分)。
Perl 用户捐献过一个模块
OLE::SpreadSheet::ParseExcel 和一个程序 xls2csv.pl 来
把Excel电子表格转换为CSV文件。包 gdata 在函数 read.xls
中队这些模块进行了基本的封装。
Previous:&,
Appendix A References
R. A. Becker, J. M. Chambers and A. R. Wilks (1988)
The New S Language.
A Programming Environment for Data Analysis
and Graphics.
Wadsworth & Brooks/Cole.
J. Bowman, S. Emberson and M. Darnovsky (1996) The
Practical SQL Handbook.
Using Structured Query Language.
Addison-Wesley.
J. M. Chambers (1998) Programming with Data.
A Guide to the S
Language. Springer-Verlag.
P. Dubois (2000) MySQL. New Riders.
M. Henning and S. Vinoski (1999) Advanced CORBA Programming
with C++. Addison-Wesley.
K. Kline and D. Kline (2001) SQL in a Nutshell. O'Reilly.
B. Momjian (2000) PostgreSQL: Introduction and Concepts.
Addison-Wesley.
Also downloadable at .
T. M. Therneau and P. M. Grambsch (2000) Modeling Survival
Extending the Cox Model. Springer-Verlag.
E. J. Yarger, G. Reese and T. King (1999) MySQL & mSQL.
Previous:&,
Function and variable index
Previous:&,
Concept index

我要回帖

更多关于 codepage 的文章

 

随机推荐