ess and debug package

Mark.Bravington at csiro.au Mark.Bravington at csiro.au
Mon Feb 2 00:03:16 CET 2004


Hi Stephen

Thanks for the report. I'd suggest trying 'options( debug.command.recall=FALSE)' before running the debugger (perhaps in '.First')-- please let me know if this works.

I've never had any joy with emacs, and I haven't been able to test debug under ESS, so I'd particularly appreciate feedback if (when) there are problems. The doco for 'savehistory' says "doesn't work in batch use of Rterm" which I guess may be ESS's modus operandi. Is it the case that 'interactive()' returns FALSE in ESS? If so, I can patch the debug code easily.

bye
Mark


*******************************

Mark Bravington
CSIRO (CMIS)
PO Box 1538
Castray Esplanade
Hobart
TAS 7001

phone (61) 3 6232 5118
fax (61) 3 6232 5012
Mark.Bravington at csiro.au 

#-----Original Message-----
#From: Stephen Eglen [mailto:stephen at inf.ed.ac.uk]
#Sent: Friday, 30 January 2004 11:57 PM
#To: Angel -
#Cc: ess-help at stat.math.ethz.ch; Bravington, Mark (CMIS, Hobart)
#Subject: ess and debug package
#
#
#
# > I was trying to use the new debug package from within 
#emacs, I get the 
# > following error:
# > >library(debug)
# > Loading required package: mvbutils
# > MVBUTILS: no "tasks" vector found in ROOT
# > MVBUTILS loaded OK
# > Loading required package: tcltk
# > >mtrace(glm) # turns tracing on
# > >names( tracees) # "glm"
# > [1] "glm"
# > >names( tracees) # "glm"
# > [1] "glm"
# > >glm(stupid.args) # voila le debugger
# > Error in savehistory(file) : no history available to save
# > 
# > Has anybody been more succesfull?
#
#I also just tried this sequence from Angel, and got the same error
#with the CVS version of ESS.  (The sequence works fine when running R
#from an xterm.)
#
#I've generated the traceback in case it is of use to the debug package
#author (cc'ed here).
#
#Stephen
#> library(debug)
#Loading required package: mvbutils 
#MVBUTILS: no "tasks" vector found in ROOT
#MVBUTILS loaded OK
#Loading required package: tcltk 
#> mtrace(glm)
#> glm(stupid.args)
#Error in savehistory(file) : no history available to save
#> traceback()
#10: savehistory(debug.hist.file)
#9: assign("answer", {
#       assign("[[", my.index)
#       assign("[[<-", my.index.assign)
#       .frames. <- empty.data.frame(actual = , debug = 0, 
#function.name = , 
#           window.name = , subframe = "", has.window.yet = FALSE)
#       .nothing. <- structure(0, class = "nullprint")
#       .step. <- .skip. <- .evaluated.OK. <- .system. <- 
#.print.result. <- .in.users.commands. <- .quit.debug. <- FALSE
#       .end.debug. <- NULL
#       back.colour <- c(" " = "White", "*" = "Red")
#       select.colour <- c(" " = "Blue", "*" = "Red")
#       values.of.typeof <- cq(symbol, pairlist, closure, environment, 
#           promise, language, special, builtin, logical, integer, 
#           double, complex, character, "...", any, expression, list, 
#           externalptr)
#       rogue.types <- c("for", "while", "repeat", "if", "switch", 
#           "break", "next", "return", "{")
#       dodgy.for.counter.types <- cq(language, symbol, promise, 
#           environment, closure, "...", any, externalptr)
#       dodgy.if.while.types <- cq("NULL", pairlist, closure, 
#environment, 
#           promise, language, special, builtin, "...", any, 
#expression, 
#           list, externalptr)
#       valid.switch.types <- cq(character, logical, integer, double, 
#           complex)
#       list.of.command.subs <- named(cq(break, next, return, q, 
#           on.exit, sys.on.exit, do.call))
#       where.to.look <- "package:debug"
#       if (where.to.look %!in% search()) 
#           where.to.look <- match("debug", sapply(1:length(search()), 
#               function(i) (names(attr(pos.to.env(i), "path")) %&% 
#                   "")[1]))
#       if (exists("debug.next", where.to.look)) 
#           subfun <- function(x) as.name("debug." %&% x)
#       else {
#           subfun <- function(x) call(":::", quote(debug), 
#as.name("debug." %&% 
#               x))
#           debug.namespace <- asNamespace("debug")
#           funs <- ls(env = debug.namespace, all = TRUE) %except% 
#               find.funs("package:debug")
#           funs <- funs[sapply(funs, exists, env = debug.namespace, 
#               mode = "function")]
#           for (ifun in funs) assign(ifun, getFromNamespace(ifun, 
#               debug.namespace))
#       }
#       list.of.command.subs <- lapply(list.of.command.subs, subfun)
#       if (debug.command.recall <- 
#option.or.default("debug.command.recall", 
#           TRUE)) {
#           debug.hist.file <- tempfile()
#           savehistory(debug.hist.file)
#       }
#       ch <- function(...) paste(c(..., "."), collapse = ",")
#       star.or.space <- function(bpex) if (is.logical(bpex) && 
#length(bpex) == 
#           1 && !is.na(bpex) && !bpex) 
#           " "
#       else "*"
#       mark.bp <- function(bpex) !(is.logical(bpex) && length(bpex) == 
#           1 && !is.na(bpex) && !bpex)
#       augment.for.eval <- function(i, call.type) c(i, 
#switch(call.type, 
#           "for" = 3, "if" = , switch = , "while" = 2, numeric(0)))
#       get.call.type <- function(ex) {
#           if (!is.call(ex) || mode(ex) == "(" || !(i <- 
#match(paste(as.character(ex[[1]]), 
#               collapse = " "), rogue.types, 0))) {
#               if (!is.call(ex) && is.expression(ex)) 
#                   "expression"
#               else "normal"
#           }
#           else rogue.types[i]
#       }
#   }, envir = <environment>)
#8: eval(expr, envir, enclos)
#7: eval(expr, envir = nlocal.env, enclos = sys.frame(sys.nframe()))
#6: mlocal({
#       assign("[[", my.index)
#       assign("[[<-", my.index.assign)
#       .frames. <- empty.data.frame(actual = , debug = 0, 
#function.name = , 
#           window.name = , subframe = "", has.window.yet = FALSE)
#       .nothing. <- structure(0, class = "nullprint")
#       .step. <- .skip. <- .evaluated.OK. <- .system. <- 
#.print.result. <- .in.users.commands. <- .quit.debug. <- FALSE
#       .end.debug. <- NULL
#       back.colour <- c(" " = "White", "*" = "Red")
#       select.colour <- c(" " = "Blue", "*" = "Red")
#       values.of.typeof <- cq(symbol, pairlist, closure, environment, 
#           promise, language, special, builtin, logical, integer, 
#           double, complex, character, "...", any, expression, list, 
#           externalptr)
#       rogue.types <- c("for", "while", "repeat", "if", "switch", 
#           "break", "next", "return", "{")
#       dodgy.for.counter.types <- cq(language, symbol, promise, 
#           environment, closure, "...", any, externalptr)
#       dodgy.if.while.types <- cq("NULL", pairlist, closure, 
#environment, 
#           promise, language, special, builtin, "...", any, 
#expression, 
#           list, externalptr)
#       valid.switch.types <- cq(character, logical, integer, double, 
#           complex)
#       list.of.command.subs <- named(cq(break, next, return, q, 
#           on.exit, sys.on.exit, do.call))
#       where.to.look <- "package:debug"
#       if (where.to.look %!in% search()) 
#           where.to.look <- match("debug", sapply(1:length(search()), 
#               function(i) (names(attr(pos.to.env(i), "path")) %&% 
#                   "")[1]))
#       if (exists("debug.next", where.to.look)) 
#           subfun <- function(x) as.name("debug." %&% x)
#       else {
#           subfun <- function(x) call(":::", quote(debug), 
#as.name("debug." %&% 
#               x))
#           debug.namespace <- asNamespace("debug")
#           funs <- ls(env = debug.namespace, all = TRUE) %except% 
#               find.funs("package:debug")
#           funs <- funs[sapply(funs, exists, env = debug.namespace, 
#               mode = "function")]
#           for (ifun in funs) assign(ifun, getFromNamespace(ifun, 
#               debug.namespace))
#       }
#       list.of.command.subs <- lapply(list.of.command.subs, subfun)
#       if (debug.command.recall <- 
#option.or.default("debug.command.recall", 
#           TRUE)) {
#           debug.hist.file <- tempfile()
#           savehistory(debug.hist.file)
#       }
#       ch <- function(...) paste(c(..., "."), collapse = ",")
#       star.or.space <- function(bpex) if (is.logical(bpex) && 
#length(bpex) == 
#           1 && !is.na(bpex) && !bpex) 
#           " "
#       else "*"
#       mark.bp <- function(bpex) !(is.logical(bpex) && length(bpex) == 
#           1 && !is.na(bpex) && !bpex)
#       augment.for.eval <- function(i, call.type) c(i, 
#switch(call.type, 
#           "for" = 3, "if" = , switch = , "while" = 2, numeric(0)))
#       get.call.type <- function(ex) {
#           if (!is.call(ex) || mode(ex) == "(" || !(i <- 
#match(paste(as.character(ex[[1]]), 
#               collapse = " "), rogue.types, 0))) {
#               if (!is.call(ex) && is.expression(ex)) 
#                   "expression"
#               else "normal"
#           }
#           else rogue.types[i]
#       }
#   })
#5: setup.debug.admin(nlocal = n.debug.HQ)
#4: find.debug.HQ(TRUE)
#3: do.in.envir(envir = find.debug.HQ(TRUE), {
#       on.exit(.end.incarnation())
#       next.incarnation()
#       repeat {
#           if (my.all.equal(i, 2) && in.body.code) 
#               retval <- j
#           else if (i[1] == 3) 
#               break
#           if (i[1] != 1) 
#               in.body.code <- FALSE
#           ch.i <- ch(i)
#           .skip. <<- FALSE
#           .skipto. <- 0
#           repeat {
#               if (.quit.debug.) {
#                   cat("\rNo ")
#                   stop("merely quitting mvb's debugger")
#               }
#               .evaluated.OK. <<- TRUE
#               .print.result. <<- FALSE
#               find.line <- match(ch.i, names(breakpoints))
#               if (!is.na(find.line)) 
#                   lno <- find.line
#               if (!stop.here() || !.step.) 
#                   break
#               if (!stopped.yet) {
#                   launch.debug.windows()
#                   stopped.yet <- TRUE
#               }
#               command <- interact()
#               try.j <- enact.command.r(command, frame)
#               if (try.j %is.not.a% "try-error" && !.system.) 
#                   j <- try.j[[1]]
#               if (.evaluated.OK.) 
#                   break
#           }
#           if (!.skip.) {
#               call.type <- get.call.type(expr[[i]])
#               if (call.type %in% c("normal", "if", "for", "while", 
#                   "switch")) {
#                   try.j <- 
#eval.catching.errors(expr[[augment.for.eval(i, 
#                     call.type)]], envir = frame)
#                   if (.evaluated.OK.) {
#                     j <- try.j
#                     if (.print.result.) 
#                       print.if.small(j)
#                     .evaluated.OK. <<- check.legality(j, call.type)
#                     if (!.evaluated.OK.) 
#                       cat("Problem:", attr(.evaluated.OK., 
#"message"), 
#                         "\n")
#                   }
#                   if (!.evaluated.OK.) {
#                     .step. <<- TRUE
#                     next
#                   }
#               }
#           }
#           if (.skip.) 
#               skipto.debug()
#           else move.to.next.expression()
#       }
#       if (in.body.code) {
#           cat("Function exited via \"skip\": return value may 
#be strange\n")
#           retval <- j
#       }
#       retval
#   })
#2: evaluator(fname = "glm")
#1: glm(stupid.args)
#> 
#




More information about the ESS-help mailing list