2013-04-10 34 views
9

Để tạm thời chỉnh sửa nội dung của hàm được đóng gói func, tôi thường sử dụng trace(func, edit=TRUE). Đối với một số lý do, tuy nhiên, R không cho tôi làm điều này khi func[.data.table:Tại sao dấu vết (..., chỉnh sửa = TRUE) không hoạt động khi ... = [.data.table

## Note: In this and the other cases below, once an editor pops up, I save and 
## and then exit without making any edits to the function. The commented-out 
## message below each call to trace() is what is then printed to my R console. 

trace("[.data.table", where=data.table, edit=TRUE) 
# Error in .makeTracedFunction(def, tracer, exit, at, print, doEdit) : 
# the editing in trace() can only change the body of the function, not 
# the arguments or defaults 

Câu hỏi: Điều gì có thể gây ra lỗi này? Những chức năng khác cũng kích hoạt nó? Đối với các chức năng như vậy, có một số công việc thay thế xung quanh sẽ cho phép tôi chỉnh sửa chúng không?

FWIW, điều này dường như không có một số vấn đề chung với các chức năng trong data.table namespace 's (xem ví dụ #1 dưới đây) cũng không phải là một vấn đề với các phương pháp tập hợp con nói chung (xem ví dụ #2 dưới đây).

## (#1)  
trace("within.data.table", where=data.table, edit=TRUE) 
# Tracing function "within.data.table" as seen from package "data.table" 
# [1] "within.data.table" 

## (#2) 
trace("[.Date", edit=TRUE) 
# Tracing function "[.Date" in package "base" 
# [1] "[.Date" 

Tôi đang chạy R-3.0.0data.table_1.8.8 trên một máy tính Windows XP, và nhận được lỗi như nhau cho dù tôi sử dụng thiết options(editor="emacs"), options(editor="notepad") hoặc sử dụng soạn thảo mặc định GUI của R.

+2

nó làm việc cho tôi trên 2.15.3 với data.table_1.8.6, Windows 7 –

+3

Tuy nhiên, tôi nhận được lỗi tương tự sau khi nâng cấp lên 1.8.8 . –

+0

@MatthewPlourde - Cảm ơn! Điều đó thực sự giúp thu hẹp vấn đề. –

Trả lời

5

Điều này rõ ràng là do việc thêm dấu ngoặc nhọn gần đây (ví dụ: {}) tại một vị trí trong danh sách đối số chính thức của data.table.

Đầu tiên, một MRE để cho thấy rằng niềng răng thực sự gây trace(..., edit=TRUE) đến nghẹt thở:

## Without braces, no problem 
func <- function(inColor=FALSE, col = if(inColor) "red" else "grey") { 
    plot(rnorm(99), col=col)} 

trace(func, edit=TRUE) 
# [1] "func" 


## With braces, tracing fails 
funcB <- function(inColor=FALSE, col = if(inColor) "red" else {"grey"}) { 
    plot(rnorm(99), col=col)} 

trace(funcB, edit=TRUE) 
# Error in .makeTracedFunction(def, tracer, exit, at, print, doEdit) : 
# the editing in trace() can only change the body of the function, not 
# the arguments or defaults 

Sau đó, cho các hồ sơ, đây là những formals cho [.data.table trong phiên bản 1.8.6 (mà truy tìm tác phẩm) và phiên bản 1.8.8 (mà nó không):

## Version 1.8.6 -- Tracing worked 
function (x, i, j, by, keyby, with=TRUE, nomatch=getOption("datatable.nomatch"), 
    mult="all", roll=FALSE, rolltolast=FALSE, 
    which=FALSE, .SDcols, verbose=getOption("datatable.verbose"), drop=NULL) 


## Version 1.8.8 -- Tracing doesn't (See {} in the 'rollends' argument) 
function (x, i, j, by, keyby, with=TRUE, nomatch=getOption("datatable.nomatch"), 
    mult = "all", roll = FALSE, 
    rollends = if (roll == "nearest") c(TRUE, 
     TRUE) else { 
     if (roll >= 0) 
      c(FALSE, TRUE) 
     else c(TRUE, FALSE) 
    }, 
    which = FALSE, .SDcols, verbose = getOption("datatable.verbose"), 
    allow.cartesian = getOption("datatable.allow.cartesian"), 
    drop = NULL, rolltolast = FALSE) 
+2

Nếu ai đó quan tâm đến * dấu vết * được định cấu hình trước cho '[.data.table' tôi đã tạo nó thành gói [dtq] (https://github.com/jangorecki/dtq), nó cũng nhanh hơn bằng cách sử dụng' dấu vết' . – jangorecki

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