2012-12-01 57 views
8

Đôi khi bạn ném nhiều browser s vào một hàm để gỡ lỗi. Tôi biết bạn có thể thoát khỏi toàn bộ shebang với Q nhưng nếu bạn muốn thoát khỏi trình duyệt thứ hai (xem mã bên dưới) và quay lại trình duyệt đầu tiên thì sao? Tôi đã nghe loại c nhưng điều đó không thoát khỏi cấp độ thứ hai browser.Thoát khỏi trình duyệt hiện tại (trả về một cấp)

FUN <- function() { 
browser()      #first one 
    lapply(1:10, function(x) { 
browser()      #second one 
     return(x) 
    }) 
} 

FUN() 
+1

tôi thêm 'qwer' (hoặc cái gì khác) ngay sau trình duyệt thứ hai. Sau đó tôi tự lật qua mã và khi tôi muốn thoát khỏi trình duyệt thứ hai, tôi chỉ cần nhấn 'c'. Nó ném một lỗi rằng đối tượng 'qwer' không tồn tại, nhưng tôi đã ra ngoài, có quần của tôi trên và trên đường về nhà. :) –

+0

Điều này thực sự là thiên tài và nó giống như lừa R. flodel cung cấp cho các phương pháp tiếp cận có trách nhiệm nhưng điều này có khả năng những gì tôi sẽ làm. Tôi nghĩ bạn nên đăng bài này như một câu trả lời. –

Trả lời

7

Tôi đồng ý với Josh và muốn đề nghị hai phương án này để mã hiện tại của bạn:

1) debugonce: Nếu chúng ta gọi là foo chức năng bên trong của bạn, sau đó debugonce(foo) sẽ khởi chạy debugger chỉ lần đầu tiên rằng foo được gọi, khi x==1.

FUN <- function() { 
    browser() 
    foo <- function(x)return(x) 
    debugonce(foo) 
    lapply(1:10, foo) 
} 

2) debugundebug. Sau khi bạn chạy debug(foo), trình gỡ lỗi sẽ được tung ra mỗi khi foo được gọi, và cho đến khi bạn chạy undebug(foo):

FUN <- function() { 
    browser() 
    foo <- function(x)return(x) 
    debug(foo) 
    lapply(1:10, foo) 
} 

Khi bạn muốn dừng gỡ lỗi foo, gõ undebug(foo) trước khi nhấn c và nó sẽ đưa bạn trở lại trình duyệt cấp đầu tiên.

+0

Câu trả lời rất kỹ lưỡng và chu đáo. Không biết về các chức năng này. Cảm ơn bạn. +1 –

+0

+1 Cũng có 'browserSetDebug', cho phép bạn di chuyển ngăn xếp cuộc gọi trong phiên' trình duyệt'. Tuy nhiên, nó dường như không hoạt động đúng khi hàm khởi chạy phiên 'trình duyệt' được gọi từ bên trong' lapply'. –

+0

Tôi không chắc mình có được đối số 'điều kiện' là gì.Lúc đầu, tôi nghĩ nó có thể giống như đối số 'expr' đối với' trình duyệt', xác định xem trình duyệt có được gọi hay không, nhưng không phải ... –

8

ckhông thoát bối cảnh trình duyệt hiện tại.

Mã của bạn, mặc dù, thực thi một "cấp độ đầu tiên" và 10 cuộc gọi trình duyệt "cấp hai" khác biệt trong khi thực thi. Do đó, khi bạn thoát khỏi một trình duyệt cấp hai thứ hai, bạn gần như ngay lập tức bị ném vào một lần nữa một lần nữa, vì vậy có vẻ như nhập c không hoạt động.

Nhập c <RETURN> 11 lần để xác nhận rằng đây là những gì đang xảy ra.

> FUN() 
Called from: FUN() 
Browse[1]> c 
Called from: FUN(1:10[[1L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[2L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[3L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[4L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[5L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[6L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[7L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[8L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[9L]], ...) 
Browse[1]> c 
Called from: FUN(1:10[[10L]], ...) 
Browse[1]> c 
4

Tôi thêm qwer (hoặc một số đối tượng khác không tồn tại) ngay sau trình duyệt thứ hai. Sau đó tôi tự lật qua mã và khi tôi muốn thoát khỏi trình duyệt thứ hai, tôi chỉ cần bấm c. Nó ném một lỗi mà đối tượng không tồn tại. Bạn sẽ được đưa trở lại cuộc gọi trình duyệt đầu tiên.

+0

Đây là một mẹo tuyệt vời –

+0

@RicardoSaporta - Tôi không hiểu mẹo này, và ước gì tôi đã làm. Qwer đi đâu, và nó cho phép bạn thoát khỏi chuỗi các cuộc gọi trình duyệt bên trong vòng lặp khi nào và chỉ khi nào bạn muốn? –

+1

@ JoshO'Brien, tôi đã sử dụng: 'lapply (seq (100), hàm (i) {browser(); quer})' Nó sẽ _not_ cho phép bạn vượt qua nhiều lần lặp (nếu gọi trong ngữ cảnh lặp lại, tất nhiên). Nhưng nó sẽ đá bạn trở lại chỉ là một mức độ bối cảnh duy nhất –

0

chạy undebug (yourFunction) này sẽ chấm dứt gỡ lỗi nhưng vẫn còn tại dấu nhắc trình duyệt sau đó gõ c và (có thể một vài lần) để trở về dấu nhắc lệnh thường xuyên

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