我实现了以下过程,旨在写入一些文件并在写入完成后在每个文件的末尾打印一条消息:
# Print one file per piaf
output_dir_piafs <- "OUTPUT_dataset_piafs"
unlink(output_dir_piafs, recursive = TRUE, force = TRUE)
dir.create(output_dir_piafs)
for (i in 1:length(lst_sorted)) {
sink() # Generates warnings...
filename <- paste(output_dir_piafs, "/piaf_", i, ".txt", sep="")
sink(file = filename, append = TRUE)
sink(type = "message")
cat(" ", colnames(file1), "\n")
for (j in 1:length(lst_sorted[[i]])) {
cat(j, " ")
lapply( lst_sorted[[i]][[j]],
function(x) {
cat(as.character(x), " ")
}
)
cat("\n")
}
## back to the console
sink()
cat(paste(filename, "done !\n"))
#flush(stdout()) # Tested, no particular effect
}
我的问题是,如果我不添加
sink()
在循环的最开始,对标准输出 ( cat(paste(filename, "done !\n"))
) 的最终写入无效。另一方面,添加这个早期sink()
生成我想避免的警告:There were 50 or more warnings (use warnings() to see the first 50)
> warnings()
Warning messages:
1: In sink() : no sink to remove
2: In sink() : no sink to remove
3: In sink() : no sink to remove
有没有人知道 sink() 的行为方式和/或如何摆脱这些警告?
注:我也试过
try(sink(), silent=TRUE)
,但 silent
选项仅防止错误...
最佳答案
您不必使用 sink
,看看?cat
,可以直接写入文件。
以下代码应该可以工作:
output_dir_piafs <- "OUTPUT_dataset_piafs"
unlink(output_dir_piafs, recursive = TRUE, force = TRUE)
dir.create(output_dir_piafs)
lst_sorted <- c(1,2,3)
file1 <- c(a=1, b=2, c=3)
for (i in 1:length(lst_sorted)) {
filename <- paste(output_dir_piafs, "/piaf_", i, ".txt", sep="")
cat(" ", colnames(file1), "\n", file=filename, append=T)
for (j in 1:length(lst_sorted[[i]])) {
cat(j, " ", file=filename, append=T)
lapply( lst_sorted[[i]][[j]],
function(x) {
cat(as.character(x), " ", file=filename, append=T)
}
)
cat("\n", file=filename, append=T)
}
cat(paste(filename, "done !\n"))
}
请注意,我设置了变量
lst_sorted
和 file1
为了使代码可重现。是否
cat
解决方案对你有用吗?
关于r - 在 R 中使用 "sink()"将写入从文件切换到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836939/