R:读写文件(输入与输出)


►从文件中读取数据框或矩阵

    可以用read.table()来读取数据框。

> z <- read.table( "D:/RCodes/zfile.txt", header=TRUE )

> z

  name age1

 John  252

 Mary  283

  Jim  19

注:此处scan()不能正确读取数据框,因为这个文件中数值和字符混杂,还含有表头。

 

    似乎没有办法直接从文件中读取数据框,不过借助其他工具可以轻松办到。一个简单快速的办法是用scan()逐行读取,用matrix()中的byrow选项设定矩阵式按行存储,而不是按列存储。 

> x <- matrix( scan("D:/RCodes/zfile.txt", quiet=TRUE),nrow=5, byrow=TRUE )

> x

     [,1] [,2] [,3] [,4]

[1,]    1    0    1    0

[2,]    0    1    0    1

[3,]    1    1    0    1

[4,]    1    0    0    1

[5,]    0    0    1    0

    上面的做法对于一次性的快速操作很有效,不过,还有一种方法,可以用read.table()先读取为数据框,再用as.matrix()将其转化为矩阵。这是一个通用的方法:

> read.matrix <- function( filename ){

+     as.matrix( read.table( filename ) )

+ }

> read.matrix( "D:/RCodes/zfile.txt" )

     V1 V2 V3 V4

[1,]  1  0  1  0

[2,]  0  1  0  1

[3,]  1  1  0  1

[4,]  1  0  0  1

[5,]  0  0  1  0

 

►读取文本文件

    在计算机文献中,文本文件(text file)和二进制文件(binary file)之间通常会有区别。但这种区别在某种程度上有些误导性,其实每个计算机文件都是由0和1编码组成,在这个意义上说,所有文件都可以认为是二进制文件。此处把文本文件定义为主要由ASCII字符或其他人类语言的编码(如为中文的GB编码)构成的文件,换行符的使用让人感觉文件是按行组成的。

    非文本文件,如JPEG图像或可执行程序文件,通常称为“二进制文件”。

    可以使用readLines()读取文本文件,无论是每次一行还是一次性全部读取。

    一次性全部读取样例:

> z <- readLines( "D:/RCodes/zfile.txt" )

> z

[1] "John 25 MN" "Mary 18 NB" "Jim 36 JF" 

 

►连接的介绍

    “连接(connection)”是R中用于多种I/O(输入输出)操作的一个基本机制。它可以用于读取文件,连接一般通过调用file()、url()或其他R函数创建。可以通过“?connection”命令查看这些函数的列表。

    我们可以逐行读取文件,样例如下:

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> readLines( rs, n=1 )

[1] "John 25 MN"

> readLines( rs, n=1 )

[1] "Mary 18 NB"

> readLines( rs, n=1 )

[1] "Jim 36 JF"

> readLines( rs, n=1 )

character(0)

    打开连接,把结果赋给变量rs,然后设定参数n=1使程序一次只能读取文件的一行。当R遇到文件结束符(EOF),就返回一个控制。我们需要设置一个连接,让R跟踪文件的进程。

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> while( TRUE ){

+     rst <- readLines( rs, n=1 )

+     if( length( rst ) == 0 ){

+         print( "reached the end" )

+         break+     }

+     else{

+         print( rst )

+     }

+ }

[1] "John 25 MN"

[1] "Mary 18 NB"

[1] "Jim 36 JF"

[1] "reached the end"

    如果想要“倒带”,从文件开始出重新读取,可以使用seek()函数:

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> readLines( rs, n=2 )

[1] "John 25 MN" "Mary 18 NB"

> seek( con=rs, where=0 )

[1] 24

> readLines( rs, n=1 )

[1] "John 25 MN"

    seek()中参数where=0表示把起始指针指向文件的最开头,即直接从开始读起。这个命令的返回值是24,说明在执行命令前指针位于24处。

    可以用close()函数来关闭连接。关闭连接可以让系统知道已经完整读取了所需文件内容,现在可以正式斜土磁盘。

 

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值