gpt4 book ai didi

r - data.table 的 tables() 函数运行我的一些 .Rprofile 函数

转载 作者:行者123 更新时间:2023-12-04 11:03:55 28 4
gpt4 key购买 nike

在我的 .Rprofile 中,我的 .First 中定义了以下两行

makeActiveBinding(".refresh", function() { system("R"); q("no") }, .GlobalEnv)
makeActiveBinding('.rm', function() {rm(list=ls(envir = .GlobalEnv),envir=.GlobalEnv); gc()}, .GlobalEnv)

它们通常是无害的,除非我不小心输入它们!第一个是 .refresh将退出并重新启动 R session 的函数。第二个清空全局环境。但是,当使用 tables()函数来自 data.table运行这两个功能并不是完全可取的。

目前,我已将它们从我的 .First 中删除。但我很好奇是否有办法避免这种情况。 tables() 中的违规行功能是:
tt = objects(envir = env, all.names = TRUE)
ss = which(as.logical(sapply(tt, function(x) is.data.table(get(x,
envir = env)))))

最佳答案

我认为您刚刚发现了以这种方式使用事件绑定(bind)的不利之处。您为什么不创建普通函数 .rm.refresh ,以通常的方式调用(即 .rm().refresh() ),并且在简单检查后不会执行?

以下是 .First 的部分内容可能如下所示:

.First <- function() {
assign(".rm",
function() {rm(list=ls(envir=.GlobalEnv), envir=.GlobalEnv)},
pos = .GlobalEnv)
}

## Try it out
j <- 1:10
ls()
.First()
.rm()
ls()

编辑,解决方案:

进一步考虑,这似乎可行,仅在直接“调用” .rm 时才执行核心位。它通过检查调用堆栈的长度来工作,并且仅在其中只有一个调用时才运行 rm(...) (表示当前对 .rm() 的调用。如果通过调用其他函数(例如 .rm )调用/触及 tables() ,则调用堆栈会更长,并且不会执行 rm()。:
makeActiveBinding('.rm', 
function() {
if(length(sys.calls())==1) {
rm(list=ls(envir = .GlobalEnv),envir=.GlobalEnv); gc()
}
},
.GlobalEnv)

## Try _it_ out
library(data.table)

j <- 100
.rm
ls()

j <- 100
tables()
ls()

关于r - data.table 的 tables() 函数运行我的一些 .Rprofile 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11231089/

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