5

私の.Rprofileには、次の2行が定義されています.First

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

誤って入力しない限り、通常は無害です。1 つ目は.refresh、R セッションを終了して再起動する関数を作成します。2 つ目は、グローバル環境を空にします。ただし、これらの 2 つの関数の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)))))
4

1 に答える 1

8

このようにアクティブバインディングを使用することの欠点を発見したと思います。代わりに、通常の方法(つまり、と)で呼び出し、単純な検査では実行されない通常の関数.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(...)が1つしかない場合にのみ実行されます(への現在の呼び出しを表します.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()
于 2012-06-27T17:06:24.943 に答える