Matlab 版 (精华区)

发信人: zjliu (秋天的萝卜), 信区: Matlab
标  题: 7.输入输出
发信站: 哈工大紫丁香 (Sat Apr 24 13:39:33 2004), 站内信件

输入输出
输出
在S交互运行时要显示某一个对象的值只要键入其名字即可,如:

> x <- 1:10                                                                   
                                          
> x                                                                           
                                          
[1]  1  2  3  4  5  6  7  8  9 10


这实际上是调用了print()函数,即print(x)。在非交互运行(程序)中应使用print()

来输出。print()函数可以带一个digits=参数指定每个数输出的有效数字位数,可以带

一个quote= 参数指定字符串输出时是否带两边的撇号,可以带一个print.gap=参数指定

矩阵或数组输出时列之间的间距。

print()函数是一个通用函数,即它对不同的自变量有不同的反应。对各种特殊对象如数

组、模型结果等都可以规定print的输出格式。

cat()函数也用来输出,但它可以把多个参数连接起来再输出(具有paste()的功能)。

例如:

> cat("i = ", i, "\n")                                                        
                                          

注意使用cat()时要自己加上换行符"\n"。它把各项转换成字符串,中间隔以空格连接起

来,然后显示。如果要使用自定义的分隔符,可以用sep=参数,例如:

> cat(c("AB", "C"), c("E", "F"), "\n", sep="")                                
                                          
ABCDEF

cat()还可以指定一个参数file=给一个文件名,可以把结果写到指定的文件中,如:
> cat("i = ", 1, "\n", file="c:/work/result.txt")                             
                                          


如果指定的文件已经存在则原来内容被覆盖。加上一个append=TRUE参数可以不覆盖原文

件而是在文件末尾附加,这很适用于运行中的结果记录。

cat()函数和print()都不具有很强的自定义格式功能,为此可以使用cat()与format()
函数配合实现。format()函数为一个数值向量找到一种共同的显示格式然后把向量转换

为字符型。例如:

> format(c(1, 100, 10000))                                                    
                                          
[1] "    1" "  100" "10000"


S-PLUS中的format()函数功能较强,具有较多的控制参数,请参见帮助。R中目前format

() 函数功能仍较弱,但R有一个formatC函数可以提供类似C语言的printf格式功能。for

matC对输入向量的每一个元素单独进行格式转换而不生成统一格式,例如:

 
> formatC(c(1, 10000))                                                        
                                          
[1] "1"      "1e+004"


在formatC()函数中可以用format=参数指定C格式类型,如"d"(整数),"f"'(定点实

数),"e"(科学记数法),"E", "g"(选择位数较少的输出格式),"G", "fg"(定点实

数但用digits 指定有效位数),"s"(字符串)。可以用width指定输出宽度,用digits

指定有效位数(格式为e,E,g,G,fg时)或小数点后位数(格式为f)时。可以用flag参数

指定一个输出选项字符串,字符串中有"-"表示输出左对齐,有"0"表示左空白用0填充,

有"+"表示要输出正负号,等等。例如,我们有一个矩阵da中保存了三个日期的年、月、

日:

> da                                                                          
                                          
     [,1] [,2] [,3]
[1,]   99    1    3
[2,]   96   11    9
[3,]   65    5   18


为了输出这三个日期,可以用apply函数指定对每一行作用一个输出函数,此输出函数利

用cat()和formatC来控制:

> apply(da, 1, function(r)                                                    
                                          
+  cat(formatC(r[1], format='d', width=2, flag='0'), '-',
+  formatC(r[2], format='d', width=2, flag='0'), '-',
+  formatC(r[3], format='d', width=2, flag='0'), '\n', sep=''))
99-01-03
96-11-09
65-05-18
NULL


这里我们知道apply函数第一个参数指定了一个矩阵,第二个参数说明对行操作还是对列

操作,第三个参数是一个函数,这里我们使用了直接定义一个函数作为参数的办法。输

出结果中多了一个NULL函数,这是因为我们在交互运行,apply的结果作为一个表达式的

值(NULL )会被显示出来。为避免显示,可以把结果赋给一个临时变量名,或者把整个

表达式作为invisible() 函数的参数,这时不显示表达式值。

S的输出缺省显示在交互窗口。可以用sink()函数指定一个文件以把后续的输出转向到这

个文件,并可用append参数指定是否要在文件末尾附加:

> sink("c:/work/result.txt", append=TRUE)                                     
                                          
> ls()                                                                        
                                          
> d                                                                           
                                          
> sink()                                                                      
                                          
调用无参数的sink()把输出恢复到交互窗口。


输入
为了从外部文件读入一个数值型向量,S提供了scan()函数。如果指定了file参数(也是

第一参数),则从指定文件读入,缺省情况下读入一个数值向量,文件中各数据以空白

分隔,读到文件尾为止。例如:

> cat(1:12, '\n', file='c:/work/result.txt')                                  
                                          

> x <- scan('c:/work/result.txt')                                             
                                          

如果文件中是一个用空白分隔的矩阵(或数组),我们可以先用scan()把它读入到一个

向量然后用matrix()函数(或array()函数)转换。如:

> y <- matrix(scan('c:/work/result.txt'), ncol=3, byrow=T)                    
                                          

实际上,scan()也能够读入一个多列的表格,只要用what参数指定一个列表,则列表每

项的类型为需要读取的类型。用skip参数可以跳过文件的开始若干行不读。用sep参数可

以指定数据间的分隔符。详见帮助。

scan()不指定读取文件名时是交互读入,读入时用一个空行结束。

如果要读取一个数据框,S提供了一个read.table()函数。它只要给出一个文件名,就可

以把文件中用空白分隔的表格数据每行读入为数据框的一行。比如,文件c:\work\d.txt

 中内容如下:

Zhou  15  3
"Li Ming" 9  李明
Zhang 10.2 Wang


用read.table读入:

> x <- read.table('c:/work/d.txt', as.is=T)                                   
                                          
> x                                                                           
                                          
       V1   V2   V3
1 Zhou    15   3
2 Li Ming 9    李明
3 Zhang   10.2 Wang

读入结果为数据框。函数可以自动识别表列是数值型还是字符型,并在缺省情况下把字

符型数据转换为因子(加上as.is=T可以保留字符型不转换)。函数自动为数据框变量指

定“V1 ”、“V2”这样的变量名,指定“1”、“2”这样的行名。可以用col.names参

数指定一个字符型向量作为数据框的变量名,用row.names参数指定一个字符型向量作为

数据框的行名。

read.table()可以读入带有表头的文件,只要加上header=TRUE参数即可。可以用sep 参

数指定表行各项的分隔符。例如,为了读入如下带有表头的逗号分隔文件c:\work\d.csv



Name,score, cn
Zhou,15,3
Li Ming, 9,  李明
Zhang, 10.2, Wang

使用如下语句:

> x                                                                           
                                          
     Name score     cn
1    Zhou  15.0      3
2 Li Ming   9.0   李明
3   Zhang  10.2   Wang

其它一些用法见帮助。



--
╔═══════════════════╗
║★★★★★友谊第一  比赛第二★★★★★║
╚═══════════════════╝

※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 202.118.229.162]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.561毫秒