2013-04-10 16 views
9

パッケージ化された関数funcの本体を一時的に編集するには、よくtrace(func, edit=TRUE)を使用します。なぜトレース(...、編集= TRUE)が機能しないのか... = [.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 

質問:このエラーを引き起こしている可能性がありますどのようないくつかの理由については、しかし、Rはfunc[.data.tableときに私はこれを実行させないのか?他のどの機能もそれを引き起こしますか?そのような機能のために、私はそれらを編集することができるいくつかの代替回避策がありますか?

FWIW、これはdata.tableの名前空間の機能といくつかの一般的な問題ではないようです(下記例えば#1を参照)また、それは、(例えば#2下記参照)一般的なサブセットの方法に問題があります。

## (#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" 

私は、Windows XPマシン上でR-3.0.0data.table_1.8.8を実行している、と私はセットoptions(editor="emacs")options(editor="notepad")を使用するか、またはR GUIのデフォルトのエディタを使用するかどうか、同じエラーを取得しています。

+2

それはdata.table_1.8.6と2.15.3、Windows 7の –

+3

に私の作品しかし、私は1.8.8にアップグレードした後、同じエラーが出ます。 –

+0

@MatthewPlourde - ありがとう!それは本当に問題の絞り込みに役立ちます。 –

答えて

5

これは、最近の中括弧({})がdata.tableの仮引数リストの1か所に追加されたために発生したようです。

まず、本当にtrace(..., edit=TRUE)を窒息させないブレースショーにMRE:

## 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 

その後は、記録のために、ここではバージョン1.8.6で[.data.tableためホルマールであり、(どの作品をトレースするため)バージョン1.8.8(それがないために):

## 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

誰かが[dtq](https://github.com/jangorecki/dtq)パッケージとして構築した '[.data.table'に対して事前設定された* trace *に興味があれば、' trace' 。 – jangorecki

関連する問題