我想知道这段代码是否读取一组文本文件并以相同的名称重新保存它们。测试时,我发现在阅读阶段生成的列表为空。这是我的代码:
library('textreadr')
path <- ("C:/testnum/")
files <- list.files(path=path, pattern="*.txt")
lines<-list()
for (i in 1:length(files)){
lines[[i]] <- scan(files[i])
}
lines[i]<-lapply(names(files), function(x)
writeLines(lines[x], file=paste(path, x, ".txt", sep = "")))
答案 0 :(得分:1)
要纠正的几件事:
list.files
返回一个未命名的character
向量,因此names(files)
将是NULL
list.files
当前返回的是正义的文件名,而不是完整的文件读取路径,因此只有在工作目录中包含相同文件的情况下,您的scan
调用才有效名字;最好采取防御措施,并将完整路径合并到文件名中lapply(files, function(i) writeLines(files[i], ...))
的使用缺少了一点,即i
是每个文件名,而不是向量的索引scan
如果给它一个文件名,则会执行自己的打开/关闭操作,因此我们可以在那里简化代码writeLines
返回NULL
,不确定为什么要将它捕获到lines[i]
中(如果i
甚至具有有意义的值)尝试一下:
path <- ("C:/Users/abidi/Desktop/testingSet/testnum/")
files <- list.files(path=path, pattern="*.txt", full.names=TRUE)
lines <- sapply(files, scan, simplify=FALSE)
然后在忽略/丢弃输出时将其写出:
ign <- lapply(files, function(fn) writeLines(fn, paste0(fn, ".txt")))
最后一行可能更短
ign <- Map(writeLines, lines, paste0(files, ".txt"))
在两种情况下,ign
仅仅是一个抛弃型变量:writeLines
的返回值为NULL
,因此您将拥有一个向量或{ {1}}个。
最后,我假设您正在对NULL
的内容进行有意义的操作,介于读取它们并将它们重新写入新文件(具有 additional {{1 }},例如lines
。