scan()函数
#从文件读取或者从键盘输入一个向量,可以是数值型的也可以是字符型的
#通过具名参数what=来控制,默认是数值型的
scan("z2.txt")
#输入字符串
scan("z2.txt",what="")
#scan()假定向量间是以空白字符间隔的,其他分隔符的话,使用sep参数
#返回去除分隔符后的字符串向量,如果指定what为字符串的话
scan("z2.txt",sep="\n")
#这个是把每一行当成一个输入
#从键盘输入字符数据
scan("",what="")
v <- scan("")```
#readline()函数
从键盘输入单行数据
w <- readline()
指定提示字符串
inits <- readline("type your initials:")```
print()函数
#打印变量或者表达式的值,但是输出内容带编号
print("abc")```
#cat()函数
在函数体内部打印变量或者表达式的值,print()
但是print()只可以输出一个表达式,并且输出内容带编号
cat()函数就解决了这个问题,比较合理的输出内容
最好带上换行符,否则下次输出就会接着上次输出
cat("abc\n")
默认分隔符是空格,sep改变之
cat("abc","love",sep="\n")
cat("abc","love",sep="")
sep设置为字符串向量
x <- c(5,12,13,8,88,99)
cat(x,sep=c(".",".",".","\n","\n"))```
从文件中读取数据框或者矩阵
#read.table()读取数据框
#表示有表头的数据框读取
z <- read.table("z",header = T)
#读取矩阵
#scan()按行读取,默认间隔是空格,默认读取类型是数字,按行读取,所以设定矩阵按行排列
x <- matrix(scan("x"),nrow=5,byrow = T)
#另外一种方式读取矩阵
read.matrix <- function(filename){
#先用read.table()读取为数据框,然后用as.matrix转换为矩阵
as.matrix(read.table(filename))
}```
#读取文本文件
文本文件主要由ASCII字符或者其他编码构成的文件
二进制文件,非文本文件,如图像或者可执行程序文件
使用readLines()读取文本文件
一次性读取整个文件,每一行作为一个向量元素,返回字符串向量
z1 <- readLines("z1")```
连接
#连接用于多种I/O操作的基本机制
#使用file(),url()函数创建
#mode r: open for reading in text mode
c <- file("z1","r")
#n=1使得程序只读取文件的一行
#当读到文件结束符EOF的时候,返回一个空值
readlines(c,n=1)```
#检测代码中的文件结束符
c <- file("z","r")
while(T)
{
r1 <- readLines(c,n=1)
if(length(r1)==0){
print("reached the end")
break
}else print(r1)
}```
改变文件指针,seek()
c <- file("z1","r")
readLines(c,n=2)
#where=0 表示希望把起始指针指向文件的最开头
seek(con = c,where=0)
#close()函数来关闭连接,使得系统将读取数据正式的写入磁盘```
#读取PUMS普查数据
extracts an integer field in the string s, in character positions
rng[1] through rng[2]
传入的rng是一个向量
将字符串读取为数字
intextract <- function(s,rng){
子字符串,start,stop
fld <- substr(s,rng[1],rng[2])
return(as.integer(fld))
}
extractpums <- function(pf,flds){
dtf <- data.frame()
con <- file(pf,"r")
process the input file
repeat{
hrec <- readlines(con,1)
#end of the file, leave loop
if(length(hrec)==0) break
#get hosehold serial number
serno <- intextract(hrec,c(2,8))
#how many person records?
npr <- intextract(hrec,c(106,107))
if(npr>0)
for(i in 1:npr){
#get person record
prec <-readlines(con,1)
#make this person's row for the data frame
person <- makerow(serno,prec,flds)
#add it to the data frame
dtf <- rbind(dtf,person)
}
}
}
set up this person's row for the data frame
fl表示变量名和列范围组成的列表
makerow <- function(srn,pr,fl){
l <- list()
l[["serno"]] <- srn
for(nm in names(fl)){
#传入的是个人记录字符串和列范围
l[[nm]] <- intextract(pr,fl[[nm]])
}
return(l)
}
调用示例
pumsdf <- extractpums("pumsa",list(Gender=c(23,23),Age=c(25,26)))```
写文件
#write.table()函数,将数据框写入文件
kids <- c("jack","jill")
ages <- c(28,29)
d <- data.frame(kids,ages,stringsAsFactors = F)
write.table(d,"kds")
#将矩阵写入文件,声明不要列名和行名
write.table(xc,"xcnew",row.names = F,col.names = F)
#cat()函数也可以用来写文件
cat("abc\n",file="u")
cat("de\n",file="u",append = T)
#也可以写多个字段
cat(file = "u",1,2,3,"i love you \n",append = T)
#还可以使用writeLines()函数,如果使用连接必须设定w参数
con <- file("www","w")
#写入的向量默认将以换行符分隔
writeLines(c("abc","de","f"),con,sep = " ")
#必须手动关闭文件连接
close(con)```
#获取文件和目录信息
file.info("www")
参数是表示文件名称的字符串向量,给出文件的信息
dir()
dir(pattern="txt",ignore.cases=T)
返回一个字符向量,列出在第一个参数指定的目录下的所有文件
recursive=T将目录树显示出来
file.exists()
判断是否存在该文件名
getwd()
setwd()
网友评论