2012-06-27 22 views
5

Trong .Rprofile của tôi, tôi đã hai dòng sau đây được định nghĩa trong tôi .Firstbảng data.table() chức năng chạy một số chức năng .Rprofile tôi

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

Họ thường vô hại, trừ khi tôi gõ chúng một cách tình cờ ! Đầu tiên tạo một hàm .refresh sẽ thoát và khởi động lại phiên R. Cái thứ hai làm trống môi trường toàn cầu. Tuy nhiên, khi sử dụng chức năng tables() từ data.table hai chức năng này đang chạy không chính xác mong muốn.

Hiện tại, tôi đã xóa chúng khỏi số .First nhưng tôi tò mò nếu có cách nào để tránh điều này. Các đường vi phạm trong hàm tables() là:

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

Trả lời

8

Tôi nghĩ bạn vừa phát hiện ra một nhược điểm khi sử dụng các liên kết hoạt động theo cách đó. Tại sao bạn không thay thế các chức năng thông thường .rm.refresh, mà bạn gọi theo cách thông thường (ví dụ: .rm().refresh()) và sẽ không được thực hiện khi kiểm tra đơn giản?

Đây là những gì một phần của .First của bạn sau đó có thể trông giống như:

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

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

Edit, với giải pháp:

On suy nghĩ xa hơn, điều này dường như làm việc, chỉ thực hiện các bit lõi khi .rm được 'gọi' trực tiếp. Nó hoạt động bằng cách kiểm tra độ dài của ngăn xếp cuộc gọi và chỉ chạy rm(...) nếu chỉ có một cuộc gọi trong đó (gọi cho số điện thoại .rm(). , các cuộc gọi stack sẽ được lâu hơn, và rm() sẽ không được thực thi .:

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() 
+0

đó là cách tôi đã viết cho họ ban đầu, nhưng những ngón tay của tôi đã quá mệt mỏi từ gõ '()' mà tôi quyết định chơi với lửa ... – Justin

+0

Đủ công bằng. Nếu bạn cố gắng giữ cho ngọn lửa đó đang diễn ra, theo thời gian, nó sẽ khiến bạn mất nhiều chi phí;) –

+0

Không có cách nào để kiểm tra môi trường hiện tại t, hoặc một tham số cho biết "đây là một môi trường tương tác ...", và làm cho các chức năng của bạn sử dụng thông tin đó để quyết định có thực hiện hay không? –

Các vấn đề liên quan