2012-05-20 37 views
7

Tôi đang gặp sự cố với gói MNP mà tôi đã truy tìm một cuộc gọi không may đến deparse (có chiều rộng tối đa được giới hạn 500 ký tự).Bắt buộc chức năng của gói sử dụng chức năng do người dùng cung cấp

nền (dễ dàng bỏ qua nếu bạn đang chán)

mnp sử dụng một cú pháp nào mang phong cách riêng để cho phép bộ sự lựa chọn khác nhau (bạn bao gồm cbind(choiceA,choiceB,...) trong định nghĩa công thức), phía bên tay trái của công thức của tôi cuộc gọi là 1700 ký tự hoặc khi model.matrix.default gọi deparse trên đó. Kể từ deparse hỗ trợ tối đa width.cutoff 500 ký tự, dòng sapply(attr(t, "variables"), deparse, width.cutoff = 500)[-1L] trong model.matrix.default đã là yếu tố đầu tiên của mình:

[1] "cbind(plan1, plan2, plan3, plan4, plan5, plan6, plan7, plan8, plan9, plan10, plan11, plan12, plan13, plan14, plan15, plan16, plan17, plan18, plan19, plan20, plan21, plan22, plan23, plan24, plan25, plan26, plan27, plan28, plan29, plan30, plan31, plan32, plan33, plan34, plan35, plan36, plan37, plan38, plan39, plan40, plan41, plan42, plan43, plan44, plan45, plan46, plan47, plan48, plan49, plan50, plan51, plan52, plan53, plan54, plan55, plan56, plan57, plan58, plan59, plan60, plan61, plan62, plan63, "  
[2] " plan64, plan65, plan66, plan67, plan68, plan69, plan70, plan71, plan72, plan73, plan74, plan75, plan76, plan77, plan78, plan79, plan80, plan81, plan82, plan83, plan84, plan85, plan86, plan87, plan88, plan89, plan90, plan91, plan92, plan93, plan94, plan95, plan96, plan97, plan98, plan99, plan100, plan101, plan102, plan103, plan104, plan105, plan106, plan107, plan108, plan109, plan110, plan111, plan112, plan113, plan114, plan115, plan116, plan117, plan118, plan119, plan120, plan121, plan122, plan123, " 
[3] " plan124, plan125, plan126, plan127, plan128, plan129, plan130, plan131, plan132, plan133, plan134, plan135, plan136, plan137, plan138, plan139, plan140, plan141, plan142, plan143, plan144, plan145, plan146, plan147, plan148, plan149, plan150, plan151, plan152, plan153, plan154, plan155, plan156, plan157, plan158, plan159, plan160, plan161, plan162, plan163, plan164, plan165, plan166, plan167, plan168, plan169, plan170, plan171, plan172, plan173, plan174, plan175, plan176, plan177, plan178, plan179, " 
[4] " plan180, plan181, plan182, plan183, plan184, plan185, plan186, plan187, plan188, plan189, plan190, plan191, plan192, plan193, plan194, plan195, plan196, plan197, plan198, plan199, plan200, plan201, plan202, plan203, plan204, plan205, plan206, plan207, plan208, plan209, plan210, plan211, plan212, plan213, plan214, plan215, plan216, plan217, plan218, plan219, plan220, plan221, plan222, plan223, plan224, plan225, plan226, plan227, plan228, plan229, plan230, plan231, plan232, plan233, plan234, plan235, " 
[5] " plan236, plan237, plan238, plan239, plan240, plan241, plan242, plan243, plan244, plan245, plan246, plan247, plan248, plan249, plan250, plan251, plan252, plan253, plan254, plan255, plan256, plan257, plan258, plan259, plan260, plan261, plan262, plan263, plan264, plan265, plan266, plan267, plan268, plan269, plan270, plan271, plan272, plan273, plan274, plan275, plan276, plan277, plan278, plan279, plan280, plan281, plan282, plan283, plan284, plan285, plan286, plan287, plan288, plan289, plan290, plan291, " 
[6] " plan292, plan293, plan294, plan295, plan296, plan297, plan298, plan299, plan300, plan301, plan302, plan303, plan304, plan305, plan306, plan307, plan308, plan309, plan310, plan311, plan312, plan313)" 

Khi model.matrix.default kiểm tra này để chống lại các biến trong data.frame, nó sẽ trả về một lỗi.

Vấn đề

Để làm được việc này, tôi đã viết một deparse chức năng mới:

deparse <- function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
    c("call", "expression", "(", "function"), control = c("keepInteger", 
                 "showAttributes", "keepNA"), nlines = -1L) { 
    ret <- .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control), nlines)) 
    paste0(ret,collapse="") 
    } 

Tuy nhiên, khi tôi chạy mnp lại và bước qua, nó sẽ trả về lỗi tương tự cho cùng một lý do (base::deparse đang được chạy, không phải là deparse) của tôi.

Đây là điều khá ngạc nhiên với tôi, như những gì tôi mong đợi được nhiều đặc trưng bởi ví dụ này, nơi mà các chức năng người dùng định nghĩa tạm thời qua viết các chức năng cơ bản:

> print <- function() { 
+ cat("user-defined print ran\n") 
+ } 
> print() 
user-defined print ran 

Tôi nhận ra một cách đúng đắn để giải quyết vấn đề này là để viết lại model.matrix.default, nhưng như một công cụ để gỡ lỗi Tôi tò mò làm thế nào để buộc nó sử dụng deparse của tôi và lý do tại sao hành vi dự đoán (bởi tôi) không xảy ra ở đây.

Trả lời

4

Các chức năng fixInNamespaceassignInNamespace được cung cấp để cho phép chỉnh sửa các chức năng hiện có. Bạn có thể thử ...nhưng tôi sẽ không từ mucking với deparse vẻ quá nguy hiểm:

assignInNamespace("deparse", 
        function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
       c("call", "expression", "(", "function"), control = c("keepInteger", 
       "showAttributes", "keepNA"), nlines = -1L) { 
    ret <- .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control), nlines)) 
    paste0(ret,collapse="") 
         } , "base") 

Có một dấu hiệu cho thấy trên trang trợ giúp mà việc sử dụng các chức năng như vậy có giới hạn và tôi sẽ không ngạc nhiên rằng chức năng cốt lõi như vậy có thể có thêm lớp bảo vệ. Vì nó hoạt động thông qua tác dụng phụ, bạn không cần phải gán kết quả.

+0

Một cảnh báo khác được đưa ra trong '? FixInNamespace':" Chúng [không được sử dụng các chức năng được ghi lại] trong mã sản xuất ". –

+0

Tôi đã có ý tưởng từ những nỗ lực của @ gsk3 rằng đây là mục đích "thử nghiệm". –

+0

Cảm ơn và cảnh báo được ghi nhận hợp lệ. Tôi có thể sẽ thay đổi hàm gọi là 'deparse' thay vì' deparse'. –

3

Đây là cách gói với namespace tìm kiếm chức năng, như mô tả trong Section 1.6, Package Namespaces của Writing R Extensions

Namespaces được niêm phong sau khi được nạp. Niêm phong có nghĩa là nhập khẩu và xuất khẩu không thể thay đổi và ràng buộc biến nội bộ không thể thay đổi. Niêm phong cho phép chiến lược triển khai đơn giản hơn cho cơ chế không gian tên. Niêm phong cũng cho phép phân tích mã và các công cụ biên dịch để xác định chính xác định nghĩa tương ứng với tham chiếu biến toàn cục trong một thân hàm.

Không gian tên kiểm soát chiến lược tìm kiếm cho các biến được sử dụng bởi các hàm trong gói. Nếu không tìm thấy cục bộ, R tìm kiếm gói không gian tên trước, sau đó nhập, sau đó là vùng tên cơ sở và sau đó đường dẫn tìm kiếm thông thường.

+0

Tôi đã tìm ra điều gì đó như thế đang diễn ra, vì vậy bạn đã xác định được vấn đề. Bây giờ làm thế nào để ghi đè? :-) –

+0

@ gsk3: Bạn có khả năng phá vỡ điều gì đó bằng cách ghi đè 'deparse', vì vậy tôi khuyên bạn nên tìm vị trí chính xác của lệnh gọi' deparse' mà bạn muốn thay đổi, chèn hàm của bạn ngay trước cuộc gọi đó và khôi phục ban đầu 'deparse' ngay sau đó. Bạn có thể sử dụng 'fixInNamespace' để thay đổi hàm chứa lời gọi' deparse' mà bạn muốn thay đổi. –

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