2012-04-03 22 views
7

Tôi đang sử dụng gói đa lõi trong R để song song mã của tôi. Tuy nhiên, nếu gói tcltk được nạp, các quá trình forking với gói đa lõi sẽ khiến R bị treo vô thời hạn. Vì vậy, tôi muốn ngăn chặn tcltk từ bao giờ tải. Tôi muốn có một lỗi ngay lập tức nếu gói nào cố gắng tải nó như là một phụ thuộc. Điều này có thể không?Làm cách nào để ngăn R tải gói?

Hoặc, tôi có thể hủy tải gói sau khi gói đã được tải không?

+0

Bạn có thể có một thư mục riêng với gói sans tcltk. R không thể tải thứ gì đó không có ở đó. –

+0

Tôi tin tcltk là một gói dựng sẵn. Tôi cho rằng tôi có thể biên dịch R mà không hỗ trợ tcltk, nhưng điều đó có vẻ hơi khắc nghiệt. –

+0

Cũng cực đoan (nhưng có lẽ thích hợp hơn ??) sẽ là tạo một gói giả, còn được đặt tên là 'tcltk' và đặt nó vào thư mục riêng biệt. Sau đó, miễn là 'libPaths' của bạn được đặt để trông đầu tiên trong thư mục đó, nó sẽ luôn tải gói giả. Sau đó bạn có thể sử dụng thiết lập như sau để một lỗi được ném bất cứ khi nào một gói cố tải 'tcltk':' setHook (hookName = packageEvent ("tcltk", "onLoad"), value = function (...) stop ("Cảnh báo: cố gắng tải tcltk")) '. (Lưu ý rằng gói sẽ vẫn được tải, mặc dù lỗi). Có vẻ như phải có một giải pháp sạch hơn. –

Trả lời

3

Nếu ngay tách các gói sau khi nó được gắn liền là một giải pháp tốt, đủ, sau đó thử một cái gì đó như sau:

setHook(hookName = packageEvent("tcltk", "attach"), 
     value = function(...) detach(package:tcltk)) 

# Try it out 
library(tcltk) 
# Loading Tcl/Tk interface ... done 
# Error in as.environment(pos) : invalid 'pos' argument 
search() 
# [1] ".GlobalEnv"  "package:graphics" "package:grDevices" 
# [4] "package:utils"  "package:datasets" "package:methods" 
# [7] "Autoloads"   "package:base"  

Nếu (như dường như có khả năng) chính động thái của tải & gắn các gói đang gây ra vấn đề, bạn cũng có thể theo đuổi một chiến lược như chiến lược được phác thảo trong các nhận xét cho câu hỏi của bạn. Cụ thể:

  1. Tạo một gói giả vô hại, cũng tên là tcltk
  2. Nơi nó trong một thư mục có tên, ví dụ, "C:/R/Library/dummy/".
  3. Trước khi chạy bất kỳ lệnh nào khác, hãy thêm thư mục đó vào .libPaths bằng cách thực hiện .libPaths(c("C:/R/Library/dummy/", .libPaths())).

Sau đó, nếu bất kỳ gói cố gắng để tải tcltk, nó sẽ lần đầu tiên tìm kiếm gói trong "C:/R/Library/dummy/", và, việc tìm kiếm một trong những cái tên đó, sẽ tải nó cho một thời điểm (trước khi nó ngay lập tức tách ra bằng cách móc mô tả ở trên).

1

Một cách khác để tránh tải một gói đặc biệt như một sự phụ thuộc là, dựa trên giả định rằng không ai trong số các chức năng bạn cần phụ thuộc vào gói phần mềm đó, sẽ phải tham khảo các chức năng bạn cần sử dụng không gian tên của họ:

lattice::xyplot(1~1) 

Bằng cách này, bạn không cần phải tải gói với chức năng của bạn, và bạn không vô tình tải gói vấn đề.

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