【问题标题】:Is there a way to log or record the output from R functions?有没有办法记录或记录 R 函数的输出?
【发布时间】:2015-12-01 18:23:50
【问题描述】:

假设我在 R 中运行一些代码。例如:

x <- 1

if (x == 0.1){
    print('X = 0.1')
    } else if (x > 0.1){
    print('X is bigger than 0.1 ')
    } else {
    print('X is smaller than 0.1')
    }

如果我查看 R studio 中的历史文件,它会告诉我我运行了这个条件语句,但它不会显示结果(即 X 大于 0.1)。

有没有办法在 R 或 R studio 中自动记录输出?

【问题讨论】:

  • 有一个函数返回一些东西,并将它保存到一个变量中?你想对输出做什么?
  • 人们对输出做什么,发布。但是,有时您运行某些东西而忘记记录它,或者当时它似乎并不重要,因此您不这样做,最终不得不找到您的数据并再次运行该命令。我只是想知道是否有一种方法可以为像我这样的杂乱无章的人设置输出的自动存档。

标签: r


【解决方案1】:

直接输出到日志文件和屏幕:

sink("myfilename", append=FALSE, split=TRUE)  # for screen and log

仅将输出返回到屏幕:

sink()

来自Quick-R

【讨论】:

  • 所以基本上我必须在运行命令之前这样做?有没有办法在历史文件中默认记录输出?
  • 运行一次,之后的所有内容都会保存到日志文件中,直到您再次键入 sink()。
  • 谢谢,太好了。这可以解决问题,由于某种原因,我在控制台中看不到输出,但它确实出现在我将其定向到的 txt 文件中。
  • OK 出来傻了,需要改变 split 参数有它作为 F :)
【解决方案2】:

你需要结合sink()cat()

首先,在您的脚本或控制台中,您可以使用sink() 来启动您的日志文件并同时向终端发送文本:

sink("myfile.log", append=TRUE, split=TRUE)

这也会将数据附加到现有的日志文件中。

然后在您的函数中将print 替换为cat,以便日志文件捕获输出。所以,在你的例子中:

sizex <- function(x){
if (x ==0.1){
    cat('X = 0.1')
    } else if (x > 0.1){
    cat('X is bigger than 0.1 ')
    } else {
    cat('X is smaller than 0.1')
    }
}

然后我们会使用函数:

x <- 1
sizex(x)

如果出于某种原因您想停止记录,只需输入sink()cat() 的好处是,如果您使用 sink(),它将恢复为将文本推送到终端,而无需代表您做出任何努力。

注意如果您想知道catprint 之间的区别,请参阅What is the difference between cat and print?

【讨论】:

    【解决方案3】:

    可以搜索“日志输出包 R”或类似的东西。这是我从搜索中提取的一个示例。

    library(log4r)
    #> 
    #> Attaching package: 'log4r'
    #> The following object is masked from 'package:base':
    #> 
    #>     debug
    
    my_logfile = "my_logfile.txt"
    
    my_console_appender = console_appender(layout = default_log_layout())
    my_file_appender = file_appender(my_logfile, append = TRUE, 
                                layout = default_log_layout())
    
    my_logger <- log4r::logger(threshold = "INFO", 
                    appenders= list(my_console_appender,my_file_appender))
    
    log4r_info <- function() {
      log4r::info(my_logger, "Info_message.")
    }
    
    log4r_error <- function() {
      log4r::error(my_logger, "Error_message")
    }
    
    log4r_debug <- function() {
      log4r::debug(my_logger, "Debug_message")
    }
    
    log4r_debug() # will not trigger log entry because threshold was set to INFO
    
    log4r_info() 
    #> INFO  [2020-07-01 12:48:02] Info_message.
    
    log4r_error() 
    #> ERROR [2020-07-01 12:48:02] Error_message
    
    readLines(my_logfile)
    #> [1] "INFO  [2020-07-01 12:48:02] Info_message."
    #> [2] "ERROR [2020-07-01 12:48:02] Error_message"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2018-10-28
      • 2016-04-11
      • 1970-01-01
      • 2017-12-24
      相关资源
      最近更新 更多