2016-05-24 14 views
10

Làm thế nào tôi có thể gỡ lỗi hiệu quả trong R nếu gói không xác định do đánh giá lười biếng. Tôi muốn giữ chức năng cơ bản browser() vì nó hoạt động tốt - ngay cả với testthat package. Như được giải thích trong post, --with-keep.source được đặt cho dự án của tôi trong "tùy chọn dự án => Công cụ xây dựng".Gói gỡ lỗi :: chức năng() mặc dù đánh giá lười biếng được sử dụng

Để tái tạo hành vi, tạo ra một gói TestDebug chứa

myfun <- function(a,b) {return(a+b)} 

và một kịch bản example.R

{ 
browser() 
TestDebug::myfun(1,2) 
} 

Sửa: Các tình huống mà TestDebug::myfun(1,2) cuộc gọi otherpackage::myfun2(1,2) nên cũng được bảo hiểm. Tôi nghĩ tình hình sẽ xảy ra trong mọi gói "thực"?

Trả lời

5

Tác phẩm sau đây dành cho tôi.

Tôi có gói của tôi TestDebug với chức năng của tôi

myfun <- function(a,b) {return(a+b)}

Nếu tôi chạy kịch bản

debug(TestDebug::myfun) 
TestDebug::myfun(1,2) 

Các bước gỡ rối ngay vào nguồn gốc của TestDebug::myfun() không vào chức năng :: như nó khi bạn đặt số browser() trước khi gọi tới số TestDebug::myfun(1,2).

Khi bạn đề cập đến trong câu hỏi của mình: trong các tình huống thực tế, TestDebug::myfun(1,2) thường gọi số otherpackage::myfun2(1,2). Nếu bạn cố gắng bước vào otherpackage::myfun2(1,2), bạn sẽ kết thúc lại bên trong chức năng ::.

Để ngăn chặn điều này tôi thêm chức năng này được gọi là bên trong các chức năng khác để chỉ số debug on the fly:

Ngay khi bạn đang trên đường bên TestDebug::myfun() nơi otherpackage::myfun2(1,2) được gọi là tôi chạy debug(otherpackage::myfun2(1,2)) trong giao diện điều khiển. Sau đó tôi có thể bước vào otherpackage::myfun2(1,2) mà không có vấn đề và kết thúc trong mã nguồn của otherpackage::myfun2(1,2). (..và không có trong mã nguồn của ::)

Đừng quên gọi undebug(otherpackage::myfun2(1,2)) sau khi bạn chắc chắn rằng vấn đề của bạn không phải là bên otherpackage::myfun2(1,2) để ngăn chặn sự debugger để nhảy vào otherpackage::myfun2(1,2) lần sau khi nó được gọi.

Nếu bạn thích, bạn cũng có thể sử dụng debugonce(otherpackage::myfun(1,2)) (thay vì debug(..)) để chỉ gỡ lỗi một chức năng một lần.

+0

Điều này giải quyết được vấn đề cho ví dụ của tôi. Tôi nhận ra rằng khi bạn có một gói "thực" với nhiều cấp độ hơn, ví dụ: 'TestDebug :: myfun (1,2)' gọi 'otherpackage :: myfun2 (1,2)' bạn chạy lại vào cùng một vấn đề. Xem chỉnh sửa của tôi về câu hỏi. – Christoph

+0

Câu trả lời được cải thiện của bạn ít nhất là một giải pháp thay thế. Tôi vẫn thắc mắc, liệu không còn lựa chọn nào khác. Mọi thứ như một tùy chọn gỡ lỗi 'skip_base_functions' có thể có hành vi mong muốn. – Christoph

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