gpt4 book ai didi

r - 获取运行时运行的所有 R 代码

转载 作者:行者123 更新时间:2023-12-03 20:56:51 27 4
gpt4 key购买 nike

假设我在脚本中有一堆 R 代码,并且我想将所有从 .GlobalEnv 运行的 R 代码连同错误和警告消息一起记录到平面文件或数据库中。
我可以编写一个简单的 logme 函数,如下所示,或者通过更改 options(error = mylogginfunction) 使其更复杂地获取错误。

mylogfile <- tempfile()
logme <- function(x){
mode <- "at"
if(!file.exists(mylogfile)){
mode <- "wt"
}
myconn <- file(mylogfile, mode)
writeLines(x, myconn)
close(myconn)
invisible()
}

logme(sprintf("%s: started some yadayada, ", Sys.time()))
x <- 10
x * 7
logme(sprintf("%s: done with yadayada", Sys.time()))

## Get the log
cat(readLines(mylogfile))

日志打印出:
2015-05-14 17:24:31:开始一些yadayada,2015-05-14 17:24:31:完成yadayada

但是我想要的是日志文件写下执行的表达式,而我不必为每个语句编写包装器。
我希望日志看起来像。
2015-05-14 17:24:31:开始一些 yadayada, x <- 10, x * 7 2015-05-14 17:24:31: 完成 yadayada

所以我的问题是,我如何获取 R 正在执行的内容,以便我可以将执行的表达式存储在日志/数据库中。并且不必在每个表达式之前编写函数调用(如 myhandler(x <- 10); myhandler(x * 10))。
这有什么帮助吗?

最佳答案

要捕获输入命令,您可以使用 addTaskCallback

mylogfile <- tempfile()
addTaskCallback(
function(...) {
expr <- deparse(as.expression(...)[[1]]) # it could handled better...
cat(expr, file=mylogfile, append=TRUE, sep="\n")
# or cat(sprintf("[%s] %s", Sys.time(), expr),...) if you want timestamps
TRUE
}
,name="logger"
)

x <- 10
x * 7

removeTaskCallback("logger")

那么结果是:
cat(readLines(mylogfile), sep="\n")
... addTaskCallback definition ...
x <- 10
x * 7

但是你得到的是 解析 表达式,这意味着该行
x+1;b<-7;b==2

将被记录为
x + 1
b <- 7
b == 2

此外:
  • 输出不会被记录,特别是 messagewarning显示在控制台
  • error 的情况下日志不会被触发,所以你需要单独的函数来处理它
  • 关于r - 获取运行时运行的所有 R 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241412/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com