【问题标题】:data.table's tables() function runs some of my .Rprofile functionsdata.table 的 tables() 函数运行我的一些 .Rprofile 函数
【发布时间】:2012-06-27 16:38:33
【问题描述】:

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

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

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

目前,我已将它们从我的.First 中删除,但我很好奇是否有办法避免这种情况。 tables() 函数中的违规行是:

tt = objects(envir = env, all.names = TRUE)
ss = which(as.logical(sapply(tt, function(x) is.data.table(get(x, 
    envir = env)))))

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为您刚刚发现了以这种方式使用活动绑定的不利之处。为什么不创建普通函数.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()
    

    【讨论】:

    • 我最初是这样写的,但是我的手指因为输入()而感到疲倦,所以我决定玩火......
    • 很公平。但是,如果你试图让这火继续下去,随着时间的推移,它最终会花费你不止几次击键;)
    • 是否有某种方法可以检查当前环境,或者说“这是一个交互式环境...”的参数,并让您的函数使用该信息来决定是否执行?
    • 有一个interactive函数返回一个逻辑值,经常用来检查R的实例是否是这样的。
    • 我认为最好趁我还可以的时候把火扑灭。我主要对语义和对此的任何想法感到好奇。但@JoshO'Brien 是对的,我会让它们真正发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多