r - 在 R 中使用 "sink()"将写入从文件切换到标准输出

标签 r file stdout keyboardinterrupt sink

我实现了以下过程,旨在写入一些文件并在写入完成后在每个文件的末尾打印一条消息:

# 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_sortedfile1为了使代码可重现。

是否cat解决方案对你有用吗?

关于r - 在 R 中使用 "sink()"将写入从文件切换到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836939/

相关文章:

regex - 在第一个遇到的数字上通过 dplyr 使用单独的 (tidyr) 分隔列

java - 在 Java 中比较两个 Excel 文件的最简单方法?

java - 用 Java 返回控制台

regex - 正则表达式"\\|"在 strsplit 中

r - 使用 R 计算比率矩阵

r - 在data.table中用string以列表的方式命名列

c - 从 .TXT 文件中跳行

c - 扫描名称和奇怪的字符串: Files

c - 如何将标准输出重定向回终端窗口

Python:subprocess.popen:读取每一行输出