4

いくつかのファイルを書き込み、書き込みが完了したときに各ファイルの最後にメッセージを出力することを目的とした次の手順を実装しました。

# 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()私の問題は、ループの最初にa を追加しないと、標準出力 ( 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オプションはエラーのみを防ぎます...

4

2 に答える 2

4

を使用する必要はありません。ファイルに直接書き込むことができる をご覧ください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ますか?

于 2013-11-07T13:23:17.343 に答える
3

sink(type="output")最後に、割り込みをキャッチするときに - - を追加して問題を修正しましたCtrl-C(これにより、後で標準出力を使用できるようになります。それ以外の場合は、ロック/迂回されたままになります)。

tryCatch({

    # 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)) {
        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(type="output")
        cat(paste(filename, "done !\n"))
    }

}, interrupt = function(ex) {

    ##cat("An interrupt was detected.\n")
    sink(type="output")            # Restore the standard output !
    ##print(ex)

}) # tryCatch()


別の方法 ( user1981275Karl Fornerの助けに基づく) は、次のようになります。

tryCatch({

    # Print one file per piaf
    output_dir_piafs <- "OUTPUT_dataset_piafs_2"
    unlink(output_dir_piafs, recursive = TRUE, force = TRUE)
    dir.create(output_dir_piafs)
    for (i in 1:length(lst_sorted)) {
        filename <- paste(output_dir_piafs, "/piaf_", i, ".txt", sep="")
        f <- file(filename, 'w')
        cat("  ", colnames(file1), "\n", file=f)

        for (j in 1:length(lst_sorted[[i]])) {
            cat(j, " ", file=f)
            lapply( lst_sorted[[i]][[j]], 
                    function(x) { 
                        cat(as.character(x), " ", file=f)
                    }
            )
            cat("\n", file=f)
        }

        flush(f)
        close(f)
        ## back to the console
        cat(paste(filename, "done !\n"))
    }

}, interrupt = function(ex) {

    closeAllConnections()

}) # tryCatch()

この解決策には、標準出力の迂回を行わないという大きな利点があります。つまり、中断をキャッチしなくても、標準出力はアクティブなままです。

次のような警告を回避するには、キーボード割り込み処理が引き続き必要であることに注意してください。

> warnings()
Warning message:
closing unused connection 3 (OUTPUT_dataset_piafs_2/piaf_16.txt)

それに応じて?closeAllConnections

「closeAllConnections」は、すべてのユーザー接続を閉じ (そして破棄し)、すべての「シンク」迂回を復元します。

最後の注意:これら 2 つの方法の間で、ファイル書き込みに関する実際の速度の違いはありません。

于 2013-11-07T14:35:15.017 に答える