数据的输入输出,包括计算机系统中R语言的键盘输入和显示器输出,程序的数据输入和执行结果输出。

2.7.1  R语言的输入和输出

所谓用户、程序员和计算机交互又称为人机交互,请注意人机交互并不代表科学实验。在R语言中称为开始一个会话,与网络中开始的会话section相同。R语言的命令在命令行>中输入,而且与UNIX系统的shell批处理命令程序类似,R语言可将多个命令集合在一起构成一个脚本文件,然而问题是该脚本文件的输出在哪里?R语言命令脚本文件的输出可在显示器,也可定向输出到一个文件中。

1.语言的输入

语言系统的输入可以是命令,R语言解释器的输入则是命令程序。命令集的脚本文件可保存为.R文件,再用source()命令完成批处理。

>source(Rlcommand.R)   #执行一个脚本文件

然而source()函数的另一个功能是编译一个R语言程序或者函数。例如,函数funfactor()保存在funfactor.R文件中,则编译并且调用函数funfactor()的方法,

>source(funfactor.R)   #编译funfactor.R文件
>saladrink=funfactor(dafr,salary,levels)  #调用函数funfactor()

将R语言程序在编辑窗口输入,可用edit()命令。或者用R语言系统菜单创建一个.R文件再保存。

2.R语言的输出

若将R语言系统的输出重定向到文本文件resultgrep中,则使用sink()命令。

>sink(resultgrep)

则R语言命令的输出将在resultgrep文件中看到。可不再让解释器把每一条输出到显示器上。

若重定向图形输出,例如plot()的输出,可保存在图形文件中。根据图形的属性,选择命令执行。最后将图形重定向恢复设置为显示器输出。windows图元文件和.bmp文件分别是,

>win.metafile("ts1.wmf")   #将图形重定向到ts1.wmf文件中
>bmp("ts1.bmp")          #将图形保存到ts1.bmp文件,.bmp文件分辨率更高
>dev.off()               #输出返回到显示器

2.7.2程序的数据输入和输出

R语言作为开源软件,它的优势是共享和方便用户,它的不利是不正式和不能形成行业。但是,R语言的数据源开放了世界无数的窗口,使有用的数据流动在我们的周围。R语言的数据源,不仅仅是程序员诚实地在键盘上输入得到的,R语言能导入.txt文件、execl文件、流行的商业统计软件SAS,SPSS,Stata文件,数据库的信息和网络上的数据。

1.程序读取键盘输入

    若只有少量数据,用函数scan()和readline()接收数据。函数scan()从键盘接收输入并且输出向量,将文件名设置为空,并且接收到空行则表示键盘输入结束。scan()的安静模式可用quiet=TRUE设置。scan()只接收数值和单字符的输入,而readline()接收字符串。

>dv1=scan("")
1: 1 2 3 4 5
6:
>dv1
[1] 1 2 3 4 5
>dv2=scan("")
1: a
2: b
3: c
4:
>dv2
[1]

readline()有两种用途。一个是用readline()方式接收输入一行字符串,保存在字符串向量中。一个是readline("提示内容"),根据提示输入答案。例如,在键盘输入"I hope we go to university together ,but now war is dealed with,please wait for victory."并且保存到向量dv3中。

>dv3=readline()
I hope we go to university together ,but now war is dealed with,please wait for victory.
>dv3
##[1] I hope we go to university together ,but now war is dealed with,please wait for victory.
> dv4=readline("There is your in fact.")  #根据提示"There is your in fact."输入回答
There is your in fact.Yes.  #Yes是回答(实际情况)
> dv4

[1] "Yes." 
2.读取windows文件

    scan("filename.txt")快速读取.txt文件到一个向量,若是包括字符的文件,则参数what=""。

>dv5=scan(file1.txt,what="")
Read 5 items.
[1] "1" "2" "3" "quiet" "study"


    若windows的.txt文件内容是数据框,则用函数read.table()读取。若数据分析员从事分析execl文件的工作,则可用read.xlsx()读取.xlsx文件,read.xls()读取.xls文件。csv格式文件可用read.csv()读取。readLines()可在文本文件中读取多行数据或者整个文件。.txt文件是空格分隔符,.csv文件是“;”分隔符。

函数read.table()的参数file设定了文件路径,header设置表头,sep设定列间隔方式。输出数据是data.frame。stringsAsFactors=FALSE设置所有的字符保存为字符串类型,默认则是因子factor。

读取.xlsx文件,应安装软件包xls,rJava。rJava软件包必须设置java环境。在系统中设置环境变量path和javapath等。read.xlsx()应注意sheet参数的设置。

>file1="D:/travers/dog.xlsx"
>datafr1=read.xlsx(file1,1)  #sheet=1

     批量读取文件的方法应该先将批量读取文件存放在固定目录下。用dir()函数获取目录中的文件名,然后用paste()合成路径,最后处理文档。对批量文件可用循环或apply族函数处理。例如:

>doc.names =dir("path")
>doc.path =sapply(doc.names,function(names)  paste(path,names,sep='/'))

合成文件路径名

>doc =sapply(doc.path,function(doc)  readLines(doc))

3.导入统计软件数据

(1) SPSS数据

统计软件的.sav文件用函数read.spss()读取,保存在数据框中。read.spss()所在软件包foreign。或者使用Hmisc软件包的函数spss.get()。函数spss.get()封装read. spss(),设置参数,最后得到数据分析人员期望的结果。

>library(Hmisc)  
>daf=spss.get("data2076.sav",use.value.labels=TRUE)  #读取.sav文件
use.value.labels=TRUE表示将有标签的变量保存为因子,而且水平相同

(2)导入SAS数据

foreign包中的read.ssd()和Hmisc包中的sas.get()可读取。注意SAS的较新版本(SAS 9.1或更高版本)可能导致函数并不能正常使用。保存为Transport format(XPORT)文件,可用foreign的函数read.xport()读取。

4.在www网站读取数据

(1) read.csv()读取数据集

为保证例题的正确性,选择《R语言编程艺术》P208页上的例题。函数paste()下载美国加州大学欧文分校的Echocardiogram数据集,保存为.csv文件。

>urluci="http://archive.ics.uci.edu/ml/machine-learning-databases/"
>databasefile=paste(urluci,"echocardiogram/echocardiogram.data",sep=" ")

合成文件名

>dataframe1=read.csv(databasefile)  #读取网络文件数据集

(2) read.table()读入数据文件

函数用url地址表示文件,格式非常简单。

> addr=http://www.abcd.com/de.txt
> read.table(file=url(addr))

(3)从网页抓取数据

网页数据有不同格式,可用不同函数读取。readLines()读取文本,readHTMLTable()读取所有表格。 Web数据抓取(Webscraping)过程中,用户从互联网上提取嵌入在网页中的信息,并保存为R语言的列表list。一个方法是使用函数readLines()下载网页,再用grep()过滤信息和gsub()函数处理。readLines()按行读取文本文件,一些非结构化的文本文件,例如电子邮件数据或微博数据,也可使用readLines()。web文件可用单引号,用n=行数表示读取的范围。例如,希望读取哈佛大学html主页前十行的数据,方法见下,

> urlnetaddr='http://www.harvard.edu/'   #哈佛大学网址
> dlisa1=readLines(urlnetaddr,n=50)
> dlisa1
>names(disa1)  #数据标签

另一种途径的方法是RCurl包和XML包来提取结构复杂的网页中的信息。 此外,scan()也有丰富的参数用来读取非结构化文档。若抓取网页上的表格,可使用XML包的readHTMLTable()函数。函数readHTMLTable()可读取XML数据。

>head(dlisa1[[2]])   #dlisa1是列表

   读取《计算机学报》PDF文件http://cjc.ict.ac.cn/online/onlinepaper/cjj-2016823101705.pdf不能使用readLines(),请读者自己思考方法。

4.写文件
保存程序的临时数据到tmp.txt文件,或者将结果保存到result1.xlsx文件,可用函数write.table()与write.csv(),并且可写到表格型数据文件。cat()函数也能输出文件。

另外,与MySQL数据库交换数据可使用RMySLQ软件包。