使用File和Cat在Base R中创建日志文件

时间:2018-08-07 20:50:34

标签: r logging cat

我正在使用R运行一些批处理复制/重新命名脚本。使用.bat文件执行该脚本,以便在MS Windows中使用命令提示符执行该文件。请注意,将要运行此目标计算机不允许外部连接(否则为Internet)安装新软件包,因此解决方案应位于 base R 中。

我可以使用cat在屏幕上打印注释,并且输出显示在运行脚本后生成的.Rout文件中。每次执行脚本时,.Rout文件将被覆盖,我想创建一个单独的日志文件。

以下是相关的代码:

if(copy_files){
  # tried different modes for the file statement below 
  log_con <- file(paste(format(Sys.time(), '%d-%b-%Y %H:%M:%S'), 
                        'move duplicates.txt'), 
                  open = 'at')
  cat('Parent directory:\t\t' , file = log_con, append= F)
  cat(parent_folder , file = log_con, append= T)
  cat('\nSubfolder to copy files to:\t ', file = log_con, append= T)
  cat(subfolder_old, file = log_con, append= T)
  cat('\n\n', file = log_con, append= T)

  # copying operations here - omitted for brevity
}

仅使用不带catfile参数的append语句可以正常工作,但是上面的代码返回以下错误消息:

> log_con <- file(paste(format(Sys.time(), '%d-%b-%Y %H:%M:%S'), 'move duplicates.txt'), open = 'at')
Error in file(paste(format(Sys.time(), "%d-%b-%Y %H:%M:%S"), "move duplicates.txt"),  : 
  cannot open the connection
In addition: Warning message:
In file(paste(format(Sys.time(), "%d-%b-%Y %H:%M:%S"), "move duplicates.txt"),  :
  cannot open file '07-Aug-2018 15:50:36 move duplicates.txt': Invalid argument
>   cat('Parent directory:\t\t' , file = log_con, append= F)
Error in cat("Parent directory:\t\t", file = log_con, append = F) : 
  cannot open the connection
In addition: Warning message:
In cat("Parent directory:\t\t", file = log_con, append = F) :
  cannot open file '07-Aug-2018 15:48:11 move duplicates.txt': Invalid argument

据我了解,该错误源于以下事实:日志文件开头不存在,并且无法打开连接。

查看文档和How to create periodically send text to a "log file" while printing normal output to console?的答案似乎表明,在第一个append = F语句中包含cat应该是可行的。我尝试了为mode命令指定不同/没有file的版本,但结果相同。 Add lines to a file的答案似乎暗示相同。我想念什么吗?

我可以创建一个文件,每次都用R附加行,但是每次运行脚本时我都希望有一个唯一的日志。

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是使用接收器,在代码开始时将 sink(“ R 放在整个过程中,然后将 sink()我希望这能解决您的问题,如果您想动态命名它,请在接收器函数内部使用paste0。